/**
 * Copyright (c) 2006
 *
 * Philipp Berger, Martin Czuchra, Gero Decker, Ole Eckermann, Lutz Gericke,
 * Alexander Hold, Alexander Koglin, Oliver Kopp, Stefan Krumnow,
 * Matthias Kunze, Philipp Maschke, Falko Menge, Christoph Neijenhuis,
 * Hagen Overdick, Zhen Peng, Nicolas Peters, Kerstin Pfitzner, Daniel Polak,
 * Steffen Ryll, Kai Schlichting, Jan-Felix Schwarz, Daniel Taschik,
 * Willi Tscheschner, Björn Wagner, Sven Wagner-Boysen, Matthias Weidlich
 *
 * Permission is hereby granted, free of charge, to any person obtaining a
 * copy of this software and associated documentation files (the "Software"),
 * to deal in the Software without restriction, including without limitation
 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
 * and/or sell copies of the Software, and to permit persons to whom the
 * Software is furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in
 * all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
 * DEALINGS IN THE SOFTWARE.
 *
 **/
if (!ORYX) {
    var ORYX = {}
}
ORYX.Utils = {
    getParamFromUrl: function (b) {
        b = b.replace(/[\[]/, "\\[").replace(/[\]]/, "\\]");
        var a = "[\\?&]" + b + "=([^&#]*)";
        var d = new RegExp(a);
        var c = d.exec(window.location.href);
        if (c == null) {
            return null
        } else {
            return c[1]
        }
    }, adjustLightness: function () {
        return arguments[0]
    }, adjustGradient: function (c, a) {
        if (ORYX.CONFIG.DISABLE_GRADIENT && c) {
            var b = a.getAttributeNS(null, "stop-color") || "#ffffff";
            $A(c.getElementsByTagName("stop")).each(function (d) {
                if (d == a) {
                    return
                }
                d.setAttributeNS(null, "stop-color", b)
            })
        }
    }
};
XMLNS = {
    ATOM: "http://www.w3.org/2005/Atom",
    XHTML: "http://www.w3.org/1999/xhtml",
    ERDF: "http://purl.org/NET/erdf/profile",
    RDFS: "http://www.w3.org/2000/01/rdf-schema#",
    RDF: "http://www.w3.org/1999/02/22-rdf-syntax-ns#",
    RAZIEL: "http://b3mn.org/Raziel",
    SCHEMA: ""
};
var Kickstart = {
    started: false, callbacks: [], alreadyLoaded: [], PATH: "", load: function () {
        Kickstart.kick()
    }, kick: function () {
        if (!Kickstart.started) {
            Kickstart.started = true;
            Kickstart.callbacks.each(function (a) {
                window.setTimeout(a, 1)
            })
        }
    }, register: function (callback) {
        with (Kickstart) {
            if (started) {
                window.setTimeout(callback, 1)
            } else {
                Kickstart.callbacks.push(callback)
            }
        }
    }, require: function (a) {
        if (Kickstart.alreadyLoaded.member(a)) {
            return false
        }
        return Kickstart.include(a)
    }, include: function (a) {
        var b = document.getElementsByTagNameNS(XMLNS.XHTML, "head")[0];
        var c = document.createElementNS(XMLNS.XHTML, "script");
        c.setAttributeNS(XMLNS.XHTML, "type", "text/javascript");
        c.src = Kickstart.PATH + a;
        b.appendChild(c);
        Kickstart.alreadyLoaded.push(a);
        return true
    }
};
Event.observe(window, "load", Kickstart.load);
var ERDF = {
    LITERAL: 1,
    RESOURCE: 2,
    DELIMITERS: [".", "-"],
    HASH: "#",
    HYPHEN: "-",
    schemas: [],
    callback: undefined,
    log: undefined,
    init: function (a) {
        ERDF.callback = a;
        ERDF.registerSchema("schema", XMLNS.SCHEMA);
        ERDF.registerSchema("rdfs", XMLNS.RDFS)
    },
    run: function () {
        return ERDF._checkProfile() && ERDF.parse()
    },
    parse: function () {
        ERDF.__startTime = new Date();
        var b = document.getElementsByTagNameNS(XMLNS.XHTML, "body");
        var c = {type: ERDF.RESOURCE, value: ""};
        var a = ERDF._parseDocumentMetadata() && ERDF._parseFromTag(b[0], c);
        ERDF.__stopTime = new Date();
        var d = (ERDF.__stopTime - ERDF.__startTime) / 1000;
        return a
    },
    _parseDocumentMetadata: function () {
        var b = document.getElementsByTagNameNS(XMLNS.XHTML, "head");
        var a = b[0].getElementsByTagNameNS(XMLNS.XHTML, "link");
        var c = b[0].getElementsByTagNameNS(XMLNS.XHTML, "meta");
        $A(a).each(function (e) {
            var d = e.getAttribute("rel");
            var g = e.getAttribute("rev");
            var f = e.getAttribute("href");
            ERDF._parseTriplesFrom(ERDF.RESOURCE, "", d, ERDF.RESOURCE, f);
            ERDF._parseTriplesFrom(ERDF.RESOURCE, f, g, ERDF.RESOURCE, "")
        });
        $A(c).each(function (f) {
            var e = f.getAttribute("name");
            var d = f.getAttribute("content");
            ERDF._parseTriplesFrom(ERDF.RESOURCE, "", e, ERDF.LITERAL, d)
        });
        return true
    },
    _parseFromTag: function (c, k, d) {
        if (!c || !c.namespaceURI || c.namespaceURI != XMLNS.XHTML) {
            return
        }
        if (!d) {
            d = 0
        }
        var a = c.getAttribute("id");
        if (c.nodeName.endsWith(":a") || c.nodeName == "a") {
            var h = c.getAttribute("rel");
            var e = c.getAttribute("rev");
            var n = c.getAttribute("href");
            var m = c.getAttribute("title");
            var g = c.textContent;
            ERDF._parseTriplesFrom(k.type, k.value, h, ERDF.RESOURCE, n, function (p) {
                var o = m ? m : g;
                ERDF._parseTriplesFrom(p.object.type, p.object.value, "rdfs.label", ERDF.LITERAL, o)
            });
            ERDF._parseTriplesFrom(k.type, k.value, e, ERDF.RESOURCE, "");
            ERDF._parseTypeTriplesFrom(k.type, k.value, h)
        } else {
            if (c.nodeName.endsWith(":img") || c.nodeName == "img") {
                var h = c.getAttribute("class");
                var n = c.getAttribute("src");
                var f = c.getAttribute("alt");
                ERDF._parseTriplesFrom(k.type, k.value, h, ERDF.RESOURCE, n, function (p) {
                    var o = f;
                    ERDF._parseTriplesFrom(p.object.type, p.object.value, "rdfs.label", ERDF.LITERAL, o)
                })
            }
        }
        var h = c.getAttribute("class");
        var m = c.getAttribute("title");
        var g = c.textContent;
        var l = m ? m : g;
        ERDF._parseTriplesFrom(k.type, k.value, h, ERDF.LITERAL, l);
        if (a) {
            k = {type: ERDF.RESOURCE, value: ERDF.HASH + a}
        }
        ERDF._parseTypeTriplesFrom(k.type, k.value, h);
        var b = c.childNodes;
        if (b) {
            $A(b).each(function (o) {
                if (o.nodeType == o.ELEMENT_NODE) {
                    ERDF._parseFromTag(o, k, d + 1)
                }
            })
        }
    },
    _parseTriplesFrom: function (c, e, d, a, b, f) {
        if (!d) {
            return
        }
        d.toLowerCase().split(" ").each(function (h) {
            var g = ERDF.schemas.find(function (l) {
                return false || ERDF.DELIMITERS.find(function (m) {
                    return h.startsWith(l.prefix + m)
                })
            });
            if (g && b) {
                h = h.substring(g.prefix.length + 1, h.length);
                var k = ERDF.registerTriple(new ERDF.Resource(e), {
                    prefix: g.prefix,
                    name: h
                }, (a == ERDF.RESOURCE) ? new ERDF.Resource(b) : new ERDF.Literal(b));
                if (f) {
                    f(k)
                }
            }
        })
    },
    _parseTypeTriplesFrom: function (a, c, b, d) {
        if (!b) {
            return
        }
        b.toLowerCase().split(" ").each(function (f) {
            var e = ERDF.schemas.find(function (h) {
                return false || ERDF.DELIMITERS.find(function (k) {
                    return f.startsWith(ERDF.HYPHEN + h.prefix + k)
                })
            });
            if (e && c) {
                f = f.substring(e.prefix.length + 2, f.length);
                var g = ERDF.registerTriple((a == ERDF.RESOURCE) ? new ERDF.Resource(c) : new ERDF.Literal(c), {
                    prefix: "rdf",
                    name: "type"
                }, new ERDF.Resource(e.namespace + f));
                if (d) {
                    d(g)
                }
            }
        })
    },
    _checkProfile: function () {
        var b = document.getElementsByTagNameNS(XMLNS.XHTML, "head");
        var a = b[0].getAttribute("profile");
        var c = false;
        if (a && a.split(" ").member(XMLNS.ERDF)) {
            return true
        } else {
            return false
        }
    },
    __stripHashes: function (a) {
        return (a && (typeof a.substring == "function") && a.substring(0, 1) == "#") ? a.substring(1, a.length) : a
    },
    registerSchema: function (b, a) {
        ERDF.schemas.push({prefix: b, namespace: a})
    },
    registerTriple: function (c, a, b) {
        if (a.prefix.toLowerCase() == "schema") {
            this.registerSchema(a.name, b.value)
        }
        var d = new ERDF.Triple(c, a, b);
        ERDF.callback(d);
        return d
    },
    __enhanceObject: function () {
        this.isResource = function () {
            return this.type == ERDF.RESOURCE
        };
        this.isLocal = function () {
            return this.isResource() && this.value.startsWith("#")
        };
        this.isCurrentDocument = function () {
            return this.isResource() && (this.value == "")
        };
        this.getId = function () {
            return this.isLocal() ? ERDF.__stripHashes(this.value) : false
        };
        this.isLiteral = function () {
            return this.type == ERDF.LIITERAL
        }
    },
    serialize: function (a) {
        if (!a) {
            return ""
        } else {
            if (a.constructor == String) {
                return a
            } else {
                if (a.constructor == Boolean) {
                    return a ? "true" : "false"
                } else {
                    return a.toString()
                }
            }
        }
    }
};
ERDF.Triple = function (c, a, b) {
    this.subject = c;
    this.predicate = a;
    this.object = b;
    this.toString = function () {
        return "[ERDF.Triple] " + this.subject.toString() + " " + this.predicate.prefix + ":" + this.predicate.name + " " + this.object.toString()
    }
};
ERDF.Resource = function (a) {
    this.type = ERDF.RESOURCE;
    this.value = a;
    ERDF.__enhanceObject.apply(this);
    this.toString = function () {
        return "&lt;" + this.value + "&gt;"
    }
};
ERDF.Literal = function (a) {
    this.type = ERDF.LITERAL;
    this.value = ERDF.serialize(a);
    ERDF.__enhanceObject.apply(this);
    this.toString = function () {
        return '"' + this.value + '"'
    }
};
var USE_ASYNCHRONOUS_REQUESTS = true;
var DISCARD_UNUSED_TRIPLES = true;
var PREFER_SPANS_OVER_DIVS = true;
var PREFER_TITLE_OVER_TEXTNODE = false;
var RESOURCE_ID_PREFIX = "resource";
var SHOW_DEBUG_ALERTS_WHEN_SAVING = false;
var SHOW_EXTENDED_DEBUG_INFORMATION = false;
var USE_ARESS_WORKAROUNDS = true;
var RESOURCE_CREATED = 1;
var RESOURCE_REMOVED = 2;
var RESOURCE_SAVED = 4;
var RESOURCE_RELOADED = 8;
var RESOURCE_SYNCHRONIZED = 16;
var TRIPLE_REMOVE = 1;
var TRIPLE_ADD = 2;
var TRIPLE_RELOAD = 4;
var TRIPLE_SAVE = 8;
var PROCESSDATA_REF = "processdata";
var DataManager = {
    init: function () {
        ERDF.init(DataManager._registerTriple);
        DataManager.__synclocal()
    }, _triples: [], _registerTriple: function (a) {
        DataManager._triples.push(a)
    }, __synclocal: function () {
        DataManager._triples = [];
        ERDF.run()
    }, __synchronizeShape: function (a) {
        var c = ResourceManager.getResource(a.resourceId);
        var b = a.serialize();
        b.each(function (d) {
            var f = (d.type == "resource");
            var e = new ERDF.Triple(new ERDF.Resource(a.resourceId), {
                prefix: d.prefix,
                name: d.name
            }, f ? new ERDF.Resource(d.value) : new ERDF.Literal(d.value));
            DataManager.setObject(e)
        });
        return c
    }, __storeShape: function (a) {
        var b = DataManager.__synchronizeShape(a);
        b.save()
    }, __forceExistance: function (a) {
        if (!$(a.resourceId)) {
            if (!$$("." + PROCESSDATA_REF)[0]) {
                DataManager.graft(XMLNS.XHTML, document.getElementsByTagNameNS(XMLNS.XHTML, "body").item(0), ["div", {
                    "class": PROCESSDATA_REF,
                    style: "display:none;"
                }])
            }
            DataManager.graft(XMLNS.XHTML, $$("." + PROCESSDATA_REF)[0], ["div", {
                id: a.resourceId,
                "class": (a instanceof ORYX.Core.Canvas) ? "-oryx-canvas" : undefined
            }])
        } else {
            var c = $(a.resourceId);
            var b = $A(c.childNodes);
            b.each(function (d) {
                c.removeChild(d)
            })
        }
    }, __persistShape: function (b) {
        var d = b.serialize();
        var a = [];
        var c = new ERDF.Resource(b.resourceId);
        DataManager.removeTriples(DataManager.query(c, undefined, undefined));
        d.each(function (f) {
            var e = (f.type == "resource") ? new ERDF.Resource(f.value) : new ERDF.Literal(f.value);
            DataManager.addTriple(new ERDF.Triple(c, {prefix: f.prefix, name: f.name}, e))
        })
    }, __persistDOM: function (d) {
        var c = d.getCanvas();
        var b = c.getChildShapes(true);
        var a = "";
        b.each(function (e) {
            DataManager.__forceExistance(e)
        });
        DataManager.__renderCanvas(d);
        a += DataManager.serialize($(ERDF.__stripHashes(d.getCanvas().resourceId)), true);
        b.each(function (e) {
            DataManager.__persistShape(e);
            a += DataManager.serialize($(ERDF.__stripHashes(e.resourceId)), true)
        });
        return a
    }, __renderCanvas: function (e) {
        var b = e.getCanvas();
        var d = e.getStencilSets();
        var a = b.getChildShapes(true);
        DataManager.__forceExistance(b);
        DataManager.__persistShape(b);
        var c = new ERDF.Resource(b.resourceId);
        DataManager.removeTriples(DataManager.query(c, undefined, undefined));
        DataManager.addTriple(new ERDF.Triple(c, {prefix: "oryx", name: "mode"}, new ERDF.Literal("writable")));
        DataManager.addTriple(new ERDF.Triple(c, {prefix: "oryx", name: "mode"}, new ERDF.Literal("fullscreen")));
        d.values().each(function (f) {
            DataManager.addTriple(new ERDF.Triple(c, {
                prefix: "oryx",
                name: "stencilset"
            }, new ERDF.Resource(f.source().replace(/&/g, "%26"))));
            DataManager.addTriple(new ERDF.Triple(c, {
                prefix: "oryx",
                name: "ssnamespace"
            }, new ERDF.Resource(f.namespace())));
            f.extensions().keys().each(function (g) {
                DataManager.addTriple(new ERDF.Triple(c, {prefix: "oryx", name: "ssextension"}, new ERDF.Literal(g)))
            })
        });
        a.each(function (f) {
            DataManager.addTriple(new ERDF.Triple(c, {
                prefix: "oryx",
                name: "render"
            }, new ERDF.Resource("#" + f.resourceId)))
        })
    }, __counter: 0, __provideId: function () {
        while ($(RESOURCE_ID_PREFIX + DataManager.__counter)) {
            DataManager.__counter++
        }
        return RESOURCE_ID_PREFIX + DataManager.__counter
    }, serializeDOM: function (a) {
        return DataManager.__persistDOM(a)
    }, syncGlobal: function (a) {
        return DataManager.__syncglobal(a)
    }, __syncglobal: function (c) {
        var b = c.getCanvas();
        var a = b.getChildShapes(true);
        a.select(function (d) {
            return !($(d.resourceId))
        }).each(function (d) {
            if (USE_ARESS_WORKAROUNDS) {
                var e = d.properties["raziel-type"];
                var g = '<div xmlns="http://www.w3.org/1999/xhtml"><span class="raziel-type">' + e + "</span></div>";
                var f = ResourceManager.__createResource(g);
                d.resourceId = f.id()
            } else {
                var f = ResourceManager.__createResource();
                d.resourceId = f.id()
            }
        });
        a.each(function (d) {
            DataManager.__storeShape(d)
        })
    }, serialize: function (f, b) {
        if (f.nodeType == f.ELEMENT_NODE) {
            var e = $A(f.childNodes);
            var c = $A(f.attributes);
            var d = new String(f.getAttribute("class"));
            var g = d.split(" ").member("transient");
            if (g) {
                return ""
            }
            var a = "<" + f.nodeName;
            if (!b) {
                a += ' xmlns="' + (f.namespaceURI ? f.namespaceURI : XMLNS.XHTML) + '" xmlns:oryx="http://oryx-editor.org"'
            }
            c.each(function (h) {
                a += " " + h.nodeName + '="' + h.nodeValue + '"'
            });
            if (e.length == 0) {
                a += "/>"
            } else {
                a += ">";
                e.each(function (h) {
                    a += DataManager.serialize(h, true)
                });
                a += "</" + f.nodeName + ">"
            }
            return a
        } else {
            if (f.nodeType == f.TEXT_NODE) {
                return f.nodeValue
            }
        }
    }, addTriple: function (c) {
        if (!c.subject.type == ERDF.LITERAL) {
            throw"Cannot add the triple " + c.toString() + " because the subject is not a resource."
        }
        var a = ERDF.__stripHashes(c.subject.value);
        var b = $(a);
        if (!b) {
            throw"Cannot add the triple " + c.toString() + ' because the subject "' + a + '" is not in the document.'
        }
        if (c.object.type == ERDF.LITERAL) {
            DataManager.graft(XMLNS.XHTML, b, ["span", {"class": (c.predicate.prefix + "-" + c.predicate.name)}, c.object.value.escapeHTML()])
        } else {
            DataManager.graft(XMLNS.XHTML, b, ["a", {
                rel: (c.predicate.prefix + "-" + c.predicate.name),
                href: c.object.value
            }])
        }
        return true
    }, removeTriples: function (b) {
        var a = b.select(function (c) {
            return DataManager.__removeTriple(c)
        });
        return a
    }, removeTriple: function (b) {
        var a = DataManager.__removeTriple(b);
        return a
    }, __removeTriple: function (d) {
        if (!d.subject.type == ERDF.LITERAL) {
            throw"Cannot remove the triple " + d.toString() + " because the subject is not a resource."
        }
        var b = ERDF.__stripHashes(d.subject.value);
        var c = $(b);
        if (!c) {
            throw"Cannot remove the triple " + d.toString() + " because the subject is not in the document."
        }
        if (d.object.type == ERDF.LITERAL) {
            var a = DataManager.__removeTripleRecursively(d, c);
            return a
        }
    }, __removeTripleRecursively: function (e, d) {
        if (d.nodeType != d.ELEMENT_NODE) {
            return false
        }
        var b = new String(d.getAttribute("class"));
        var a = $A(d.childNodes);
        if (b.include(e.predicate.prefix + "-" + e.predicate.name)) {
            var c = d.textContent;
            if ((e.object.type == ERDF.LITERAL) && (e.object.value == c)) {
                d.parentNode.removeChild(d)
            }
            return true
        } else {
            a.each(function (f) {
                DataManager.__removeTripleRecursively(e, f)
            });
            return false
        }
    }, graft: function (g, f, d, l) {
        l = (l || (f && f.ownerDocument) || document);
        var h;
        if (d === undefined) {
            echo("Can't graft an undefined value")
        } else {
            if (d.constructor == String) {
                h = l.createTextNode(d)
            } else {
                for (var c = 0; c < d.length; c++) {
                    if (c === 0 && d[c].constructor == String) {
                        var a = d[c].match(/^([a-z][a-z0-9]*)\.([^\s\.]+)$/i);
                        if (a) {
                            h = l.createElementNS(g, a[1]);
                            h.setAttributeNS(null, "class", a[2]);
                            continue
                        }
                        a = d[c].match(/^([a-z][a-z0-9]*)$/i);
                        if (a) {
                            h = l.createElementNS(g, a[1]);
                            continue
                        }
                        h = l.createElementNS(g, "span");
                        h.setAttribute(null, "class", "namelessFromLOL")
                    }
                    if (d[c] === undefined) {
                        echo("Can't graft an undefined value in a list!")
                    } else {
                        if (d[c].constructor == String || d[c].constructor == Array) {
                            this.graft(g, h, d[c], l)
                        } else {
                            if (d[c].constructor == Number) {
                                this.graft(g, h, d[c].toString(), l)
                            } else {
                                if (d[c].constructor == Object) {
                                    for (var b in d[c]) {
                                        h.setAttributeNS(null, b, d[c][b])
                                    }
                                } else {
                                    if (d[c].constructor == Boolean) {
                                        this.graft(g, h, d[c] ? "true" : "false", l)
                                    } else {
                                        throw"Object " + d[c] + " is inscrutable as an graft arglet."
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
        if (f) {
            f.appendChild(h)
        }
        return Element.extend(h)
    }, setObject: function (a) {
        var b = DataManager.query(a.subject, a.predicate, undefined);
        DataManager.removeTriples(b);
        DataManager.addTriple(a);
        return true
    }, query: function (c, a, b) {
        return DataManager._triples.select(function (e) {
            var d = ((c) ? (e.subject.type == c.type) && (e.subject.value == c.value) : true);
            if (a) {
                d = d && ((a.prefix) ? (e.predicate.prefix == a.prefix) : true);
                d = d && ((a.name) ? (e.predicate.name == a.name) : true)
            }
            d = d && ((b) ? (e.object.type == b.type) && (e.object.value == b.value) : true);
            return d
        })
    }
};
Kickstart.register(DataManager.init);

function assert(b, a) {
    if (!b) {
        throw a
    }
}

function DMCommand(a, b) {
    this.action = a;
    this.triple = b;
    this.toString = function () {
        return "Command(" + a + ", " + b + ")"
    }
}

function DMCommandHandler(a) {
    this.__setNext = function (c) {
        var b = this.__next;
        this.__next = a;
        return b ? b : true
    };
    this.__setNext(a);
    this.__invokeNext = function (b) {
        return this.__next ? this.__next.handle(b) : false
    };
    this.handle = function (b) {
        return this.process(b) ? true : this.__invokeNext(b)
    };
    this.process = function (b) {
        return false
    }
}

function MetaTagHandler(next) {
    DMCommandHandler.apply(this, [next]);
    this.process = function (command) {
        with (command.triple) {
            if (!((subject instanceof ERDF.Resource) && (subject.isCurrentDocument()) && (object instanceof ERDF.Literal))) {
                return false
            }
        }
    }
}

var chain = new MetaTagHandler();
var command = new DMCommand(TRIPLE_ADD, new ERDF.Triple(new ERDF.Resource(""), "rdf:tool", new ERDF.Literal("")));
ResourceManager = {
    __corrupt: false, __latelyCreatedResource: undefined, __listeners: $H(), __token: 1, addListener: function (d, b) {
        if (!(d instanceof Function)) {
            throw"Resource event listener is not a function!"
        }
        if (!(b)) {
            throw"Invalid mask for resource event listener registration."
        }
        var a = {listener: d, mask: b};
        var c = ResourceManager.__token++;
        ResourceManager.__listeners[c] = a;
        return c
    }, removeListener: function (a) {
        return ResourceManager.__listners.remove(a)
    }, __Event: function (a, b) {
        this.action = a;
        this.resourceId = b
    }, __dispatchEvent: function (a) {
        ResourceManager.__listeners.values().each(function (b) {
            if (a.action & b.mask) {
                return b.listener(a)
            }
        })
    }, getResource: function (c) {
        c = ERDF.__stripHashes(c);
        var b = DataManager.query(new ERDF.Resource("#" + c), {prefix: "raziel", name: "entry"}, undefined);
        if ((b.length == 1) && (b[0].object.isResource())) {
            var a = b[0].object.value;
            return new ResourceManager.__Resource(c, a)
        }
        throw ("Resource with id " + c + " not recognized as such. " + ((b.length > 1) ? " There is more than one raziel:entry URL." : " There is no raziel:entry URL."));
        return false
    }, __createResource: function (e) {
        var d = DataManager.query(new ERDF.Resource(""), {prefix: "raziel", name: "collection"}, undefined);
        if ((d.length == 1) && (d[0].object.isResource())) {
            var b = d[0].object.value;
            var c = undefined;
            var a = e ? e : '<div xmlns="http://www.w3.org/1999/xhtml"></div>';
            ResourceManager.__request("POST", b, a, function () {
                var f = (this.responseXML);
                var h = f.childNodes[0];
                var g = h.getAttribute("id");
                if (!$$("." + PROCESSDATA_REF)[0]) {
                    DataManager.graft(XMLNS.XHTML, document.getElementsByTagNameNS(XMLNS.XHTML, "body").item(0), ["div", {
                        "class": PROCESSDATA_REF,
                        style: "display:none;"
                    }])
                }
                $$("." + PROCESSDATA_REF)[0].appendChild(h.cloneNode(true));
                DataManager.__synclocal();
                c = new ResourceManager.getResource(g);
                ResourceManager.__resourceActionSucceeded(this, RESOURCE_CREATED, undefined)
            }, function () {
                ResourceManager.__resourceActionFailed(this, RESOURCE_CREATED, undefined)
            }, false);
            return c
        }
        throw"Could not create resource! raziel:collection URL is missing!";
        return false
    }, __Resource: function (b, a) {
        this.__id = b;
        this.__url = a;
        this.id = function () {
            return this.__id
        };
        this.url = function () {
            return this.__url
        };
        this.reload = function () {
            var d = this.__url;
            var c = this.__id;
            ResourceManager.__request("GET", d, null, function () {
                ResourceManager.__resourceActionSucceeded(this, RESOURCE_RELOADED, c)
            }, function () {
                ResourceManager.__resourceActionFailed(this, RESURCE_RELOADED, c)
            }, USE_ASYNCHRONOUS_REQUESTS)
        };
        this.save = function (e) {
            var d = this.__url;
            var c = this.__id;
            data = DataManager.serialize($(c));
            ResourceManager.__request("PUT", d, data, function () {
                ResourceManager.__resourceActionSucceeded(this, e ? RESOURCE_SAVED | RESOURCE_SYNCHRONIZED : RESOURCE_SAVED, c)
            }, function () {
                ResourceManager.__resourceActionFailed(this, e ? RESOURCE_SAVED | RESOURCE_SYNCHRONIZED : RESOURCE.SAVED, c)
            }, USE_ASYNCHRONOUS_REQUESTS)
        };
        this.remove = function () {
            var d = this.__url;
            var c = this.__id;
            ResourceManager.__request("DELETE", d, null, function () {
                ResourceManager.__resourceActionSucceeded(this, RESOURCE_REMOVED, c)
            }, function () {
                ResourceManager.__resourceActionFailed(this, RESOURCE_REMOVED, c)
            }, USE_ASYNCHRONOUS_REQUESTS)
        }
    }, request: function (c, a) {
        var b = {method: "get", asynchronous: true, parameters: {}};
        Object.extend(b, a || {});
        var d = Hash.toQueryString(b.parameters);
        if (d) {
            c += (c.include("?") ? "&" : "?") + d
        }
        return ResourceManager.__request(b.method, c, b.data, (b.onSuccess instanceof Function ? function () {
            b.onSuccess(this)
        } : undefined), (b.onFailure instanceof Function ? function () {
            b.onFailure(this)
        } : undefined), b.asynchronous && USE_ASYNCHRONOUS_REQUESTS, b.headers)
    }, __request: function (a, b, f, n, m, d, c) {
        var g = Try.these(function () {
            return new XMLHttpRequest()
        }, function () {
            return new ActiveXObject("Msxml2.XMLHTTP")
        }, function () {
            return new ActiveXObject("Microsoft.XMLHTTP")
        });
        if (!g) {
            if (!this.__corrupt) {
                throw"This browser does not provide any AJAX functionality. You will not be able to use the software provided with the page you are viewing. Please consider installing appropriate extensions."
            }
            this.__corrupt = true;
            return false
        }
        if (n instanceof Function) {
            g.onload = n
        }
        if (m instanceof Function) {
            g.onerror = m
        }
        var k = $H(c);
        k.keys().each(function (e) {
            g.setRequestHeader(e, k[e])
        });
        try {
            if (SHOW_DEBUG_ALERTS_WHEN_SAVING) {
                alert(a + " " + b + "\n" + SHOW_EXTENDED_DEBUG_INFORMATION ? f : "")
            }
            g.open(a, b, !d ? false : true);
            g.send(f)
        } catch (l) {
            return false
        }
        return true
    }, __resourceActionSucceeded: function (g, c, f) {
        var a = g.status;
        var b = g.responseText;
        if (SHOW_DEBUG_ALERTS_WHEN_SAVING) {
            alert(a + " " + url + "\n" + SHOW_EXTENDED_DEBUG_INFORMATION ? data : "")
        }
        if (a >= 300) {
            throw"The server responded with an error: " + a + "\n" + (SHOW_EXTENDED_DEBUG_INFORMATION ? +data : "If you need additional information here, including the data sent by the server, consider setting SHOW_EXTENDED_DEBUG_INFORMATION to true.")
        }
        switch (c) {
            case RESOURCE_REMOVED:
                var b = (g.responseXML);
                var e = b.childNodes[0];
                var f = e.getAttribute("id");
                var d = document.getElementById(f);
                d.parentNode.removeChild(d);
                break;
            case RESOURCE_CREATED:
                break;
            case RESOURCE_SAVED | RESOURCE_SYNCHRONIZED:
                DataManager.__synclocal();
            case RESOURCE_SAVED:
                break;
            case RESOURCE_RELOADED:
                var b = (g.responseXML);
                var e = b.childNodes[0];
                var f = e.getAttribute("id");
                var d = document.getElementById(f);
                d.parentNode.removeChild(d);
                if (!$$(PROCESSDATA_REF)[0]) {
                    DataManager.graft(XMLNS.XHTML, document.getElementsByTagNameNS(XMLNS.XHTML, "body").item(0), ["div", {
                        "class": PROCESSDATA_REF,
                        style: "display:none;"
                    }])
                }
                $$(PROCESSDATA_REF)[0].appendChild(e.cloneNode(true));
                DataManager.__synclocal();
                break;
            default:
                DataManager.__synclocal()
        }
        ResourceManager.__dispatchEvent(new ResourceManager.__Event(c, f))
    }, __resourceActionFailed: function (c, a, b) {
        throw"Fatal: Resource action failed. There is something horribly wrong with either the server, the transport protocol or your online status. Sure you're online?"
    }
};
var Clazz = function () {
};
Clazz.prototype.construct = function () {
};
Clazz.extend = function (e) {
    var a = function () {
        if (arguments[0] !== Clazz) {
            this.construct.apply(this, arguments)
        }
    };
    var d = new this(Clazz);
    var b = this.prototype;
    for (var f in e) {
        var c = e[f];
        if (c instanceof Function) {
            c.$ = b
        }
        d[f] = c
    }
    a.prototype = d;
    a.extend = this.extend;
    return a
};
if (!ORYX) {
    var ORYX = {}
}
if (!ORYX.CONFIG) {
    ORYX.CONFIG = {}
}
ORYX.CONFIG.ROOT_PATH = "editor/";
ORYX.CONFIG.EXPLORER_PATH = "explorer";
ORYX.CONFIG.LIBS_PATH = "libs";
ORYX.CONFIG.SERVER_HANDLER_ROOT = "service";
ORYX.CONFIG.SERVER_EDITOR_HANDLER = ORYX.CONFIG.SERVER_HANDLER_ROOT + "/editor";
ORYX.CONFIG.SERVER_MODEL_HANDLER = ORYX.CONFIG.SERVER_HANDLER_ROOT + "/model";
ORYX.CONFIG.STENCILSET_HANDLER = ORYX.CONFIG.SERVER_HANDLER_ROOT + "/editor_stencilset?embedsvg=true&url=true&namespace=";
ORYX.CONFIG.STENCIL_SETS_URL = ORYX.CONFIG.SERVER_HANDLER_ROOT + "/editor_stencilset";
ORYX.CONFIG.PLUGINS_CONFIG = "editor-app/plugins.xml";
ORYX.CONFIG.SYNTAXCHECKER_URL = ORYX.CONFIG.SERVER_HANDLER_ROOT + "/syntaxchecker";
ORYX.CONFIG.DEPLOY_URL = ORYX.CONFIG.SERVER_HANDLER_ROOT + "/model/deploy";
ORYX.CONFIG.MODEL_LIST_URL = ORYX.CONFIG.SERVER_HANDLER_ROOT + "/models";
ORYX.CONFIG.FORM_FLOW_LIST_URL = ORYX.CONFIG.SERVER_HANDLER_ROOT + "/formflows";
ORYX.CONFIG.FORM_FLOW_IMAGE_URL = ORYX.CONFIG.SERVER_HANDLER_ROOT + "/formflow";
ORYX.CONFIG.FORM_LIST_URL = ORYX.CONFIG.SERVER_HANDLER_ROOT + "/forms";
ORYX.CONFIG.FORM_IMAGE_URL = ORYX.CONFIG.SERVER_HANDLER_ROOT + "/form";
ORYX.CONFIG.SUB_PROCESS_LIST_URL = ORYX.CONFIG.SERVER_HANDLER_ROOT + "/subprocesses";
ORYX.CONFIG.SUB_PROCESS_IMAGE_URL = ORYX.CONFIG.SERVER_HANDLER_ROOT + "/subprocess";
ORYX.CONFIG.TEST_SERVICE_URL = ORYX.CONFIG.SERVER_HANDLER_ROOT + "/service/";
ORYX.CONFIG.SERVICE_LIST_URL = ORYX.CONFIG.SERVER_HANDLER_ROOT + "/services";
ORYX.CONFIG.CONDITION_ELEMENT_LIST_URL = ORYX.CONFIG.SERVER_HANDLER_ROOT + "/conditionelements";
ORYX.CONFIG.VARIABLEDEF_ELEMENT_LIST_URL = ORYX.CONFIG.SERVER_HANDLER_ROOT + "/variabledefinitionelements";
ORYX.CONFIG.VALIDATOR_LIST_URL = ORYX.CONFIG.SERVER_HANDLER_ROOT + "/validators";
ORYX.CONFIG.SS_EXTENSIONS_FOLDER = ORYX.CONFIG.ROOT_PATH + "stencilsets/extensions/";
ORYX.CONFIG.SS_EXTENSIONS_CONFIG = ORYX.CONFIG.SERVER_HANDLER_ROOT + "/editor_ssextensions";
ORYX.CONFIG.ORYX_NEW_URL = "/new";
ORYX.CONFIG.BPMN_LAYOUTER = ORYX.CONFIG.ROOT_PATH + "bpmnlayouter";
ORYX.CONFIG.EXPRESSION_METADATA_URL = ORYX.CONFIG.SERVER_HANDLER_ROOT + "/expression-metadata";
ORYX.CONFIG.DATASOURCE_METADATA_URL = ORYX.CONFIG.SERVER_HANDLER_ROOT + "/datasource-metadata";
if (!ORYX) {
    var ORYX = {}
}
if (!ORYX.CONFIG) {
    ORYX.CONFIG = {}
}
ORYX.CONFIG.BACKEND_SWITCH = true;
ORYX.CONFIG.PANEL_LEFT_WIDTH = 250;
ORYX.CONFIG.PANEL_RIGHT_COLLAPSED = true;
ORYX.CONFIG.PANEL_RIGHT_WIDTH = 300;
ORYX.CONFIG.APPNAME = "KISBPM";
ORYX.CONFIG.WEB_URL = ".";
ORYX.CONFIG.BLANK_IMAGE = ORYX.CONFIG.LIBS_PATH + "/ext-2.0.2/resources/images/default/s.gif";
ORYX.CONFIG.OFFSET_HEADER = 61;
ORYX.CONFIG.SHOW_GRIDLINE = true;
ORYX.CONFIG.MODE_READONLY = "readonly";
ORYX.CONFIG.MODE_FULLSCREEN = "fullscreen";
ORYX.CONFIG.WINDOW_HEIGHT = 800;
ORYX.CONFIG.PREVENT_LOADINGMASK_AT_READY = false;
ORYX.CONFIG.PLUGINS_ENABLED = true;
ORYX.CONFIG.PLUGINS_FOLDER = "Plugins/";
ORYX.CONFIG.BPMN20_SCHEMA_VALIDATION_ON = true;
ORYX.CONFIG.NAMESPACE_ORYX = "http://www.b3mn.org/oryx";
ORYX.CONFIG.NAMESPACE_SVG = "http://www.w3.org/2000/svg";
ORYX.CONFIG.CANVAS_WIDTH = 1330;
ORYX.CONFIG.CANVAS_HEIGHT = 1050;
ORYX.CONFIG.CANVAS_RESIZE_INTERVAL = 100;
ORYX.CONFIG.CANVAS_MIN_WIDTH = 800;
ORYX.CONFIG.CANVAS_MIN_HEIGHT = 300;
ORYX.CONFIG.SELECTED_AREA_PADDING = 4;
ORYX.CONFIG.CANVAS_BACKGROUND_COLOR = "none";
ORYX.CONFIG.GRID_DISTANCE = 30;
ORYX.CONFIG.GRID_ENABLED = true;
ORYX.CONFIG.ZOOM_OFFSET = 0.1;
ORYX.CONFIG.DEFAULT_SHAPE_MARGIN = 60;
ORYX.CONFIG.SCALERS_SIZE = 7;
ORYX.CONFIG.MINIMUM_SIZE = 20;
ORYX.CONFIG.MAXIMUM_SIZE = 10000;
ORYX.CONFIG.OFFSET_MAGNET = 15;
ORYX.CONFIG.OFFSET_EDGE_LABEL_TOP = 8;
ORYX.CONFIG.OFFSET_EDGE_LABEL_BOTTOM = 8;
ORYX.CONFIG.OFFSET_EDGE_BOUNDS = 5;
ORYX.CONFIG.COPY_MOVE_OFFSET = 30;
ORYX.CONFIG.BORDER_OFFSET = 14;
ORYX.CONFIG.MAX_NUM_SHAPES_NO_GROUP = 20;
ORYX.CONFIG.SHAPEMENU_CREATE_OFFSET_CORNER = 30;
ORYX.CONFIG.SHAPEMENU_CREATE_OFFSET = 45;
ORYX.CONFIG.SHAPEMENU_RIGHT = "Oryx_Right";
ORYX.CONFIG.SHAPEMENU_BOTTOM = "Oryx_Bottom";
ORYX.CONFIG.SHAPEMENU_LEFT = "Oryx_Left";
ORYX.CONFIG.SHAPEMENU_TOP = "Oryx_Top";
ORYX.CONFIG.MORPHITEM_DISABLED = "Oryx_MorphItem_disabled";
ORYX.CONFIG.TYPE_STRING = "string";
ORYX.CONFIG.TYPE_BOOLEAN = "boolean";
ORYX.CONFIG.TYPE_INTEGER = "integer";
ORYX.CONFIG.TYPE_FLOAT = "float";
ORYX.CONFIG.TYPE_COLOR = "color";
ORYX.CONFIG.TYPE_DATE = "date";
ORYX.CONFIG.TYPE_CHOICE = "choice";
ORYX.CONFIG.TYPE_URL = "url";
ORYX.CONFIG.TYPE_DIAGRAM_LINK = "diagramlink";
ORYX.CONFIG.TYPE_COMPLEX = "complex";
ORYX.CONFIG.TYPE_MULTIPLECOMPLEX = "multiplecomplex";
ORYX.CONFIG.TYPE_TEXT = "text";
ORYX.CONFIG.TYPE_KISBPM_MULTIINSTANCE = "kisbpm-multiinstance";
ORYX.CONFIG.TYPE_MODEL_LINK = "modellink";
ORYX.CONFIG.TYPE_FORM_FLOW_LINK = "formflowlink";
ORYX.CONFIG.TYPE_FORM_LINK = "formlink";
ORYX.CONFIG.TYPE_SUB_PROCESS_LINK = "subprocess-link";
ORYX.CONFIG.TYPE_SERVICE_LINK = "servicelink";
ORYX.CONFIG.TYPE_CONDITIONS = "conditions";
ORYX.CONFIG.TYPE_VARIABLES = "variables";
ORYX.CONFIG.TYPE_LISTENER = "listener";
ORYX.CONFIG.TYPE_EPC_FREQ = "epcfrequency";
ORYX.CONFIG.TYPE_GLOSSARY_LINK = "glossarylink";
ORYX.CONFIG.TYPE_EXPRESSION = "expression";
ORYX.CONFIG.TYPE_DATASOURCE = "datasource";
ORYX.CONFIG.TYPE_DATASOURCE_MINIMAL = "datasource-minimal";
ORYX.CONFIG.TYPE_VALIDATORS = "validators";
ORYX.CONFIG.LABEL_LINE_DISTANCE = 2;
ORYX.CONFIG.LABEL_DEFAULT_LINE_HEIGHT = 12;
ORYX.CONFIG.ENABLE_MORPHMENU_BY_HOVER = false;
ORYX.CONFIG.EDITOR_ALIGN_BOTTOM = 1;
ORYX.CONFIG.EDITOR_ALIGN_MIDDLE = 2;
ORYX.CONFIG.EDITOR_ALIGN_TOP = 4;
ORYX.CONFIG.EDITOR_ALIGN_LEFT = 8;
ORYX.CONFIG.EDITOR_ALIGN_CENTER = 16;
ORYX.CONFIG.EDITOR_ALIGN_RIGHT = 32;
ORYX.CONFIG.EDITOR_ALIGN_SIZE = 48;
ORYX.CONFIG.EVENT_MOUSEDOWN = "mousedown";
ORYX.CONFIG.EVENT_MOUSEUP = "mouseup";
ORYX.CONFIG.EVENT_MOUSEOVER = "mouseover";
ORYX.CONFIG.EVENT_MOUSEOUT = "mouseout";
ORYX.CONFIG.EVENT_MOUSEMOVE = "mousemove";
ORYX.CONFIG.EVENT_DBLCLICK = "dblclick";
ORYX.CONFIG.EVENT_KEYDOWN = "keydown";
ORYX.CONFIG.EVENT_KEYUP = "keyup";
ORYX.CONFIG.EVENT_LOADED = "editorloaded";
ORYX.CONFIG.EVENT_SAVED = "editorSaved";
ORYX.CONFIG.EVENT_EXECUTE_COMMANDS = "executeCommands";
ORYX.CONFIG.EVENT_STENCIL_SET_LOADED = "stencilSetLoaded";
ORYX.CONFIG.EVENT_SELECTION_CHANGED = "selectionchanged";
ORYX.CONFIG.EVENT_SHAPEADDED = "shapeadded";
ORYX.CONFIG.EVENT_SHAPEREMOVED = "shaperemoved";
ORYX.CONFIG.EVENT_PROPERTY_CHANGED = "propertyChanged";
ORYX.CONFIG.EVENT_DRAGDROP_START = "dragdrop.start";
ORYX.CONFIG.EVENT_SHAPE_MENU_CLOSE = "shape.menu.close";
ORYX.CONFIG.EVENT_DRAGDROP_END = "dragdrop.end";
ORYX.CONFIG.EVENT_RESIZE_START = "resize.start";
ORYX.CONFIG.EVENT_RESIZE_END = "resize.end";
ORYX.CONFIG.EVENT_DRAGDOCKER_DOCKED = "dragDocker.docked";
ORYX.CONFIG.EVENT_HIGHLIGHT_SHOW = "highlight.showHighlight";
ORYX.CONFIG.EVENT_HIGHLIGHT_HIDE = "highlight.hideHighlight";
ORYX.CONFIG.EVENT_LOADING_ENABLE = "loading.enable";
ORYX.CONFIG.EVENT_LOADING_DISABLE = "loading.disable";
ORYX.CONFIG.EVENT_LOADING_STATUS = "loading.status";
ORYX.CONFIG.EVENT_OVERLAY_SHOW = "overlay.show";
ORYX.CONFIG.EVENT_OVERLAY_HIDE = "overlay.hide";
ORYX.CONFIG.EVENT_ARRANGEMENT_TOP = "arrangement.setToTop";
ORYX.CONFIG.EVENT_ARRANGEMENT_BACK = "arrangement.setToBack";
ORYX.CONFIG.EVENT_ARRANGEMENT_FORWARD = "arrangement.setForward";
ORYX.CONFIG.EVENT_ARRANGEMENT_BACKWARD = "arrangement.setBackward";
ORYX.CONFIG.EVENT_PROPWINDOW_PROP_CHANGED = "propertyWindow.propertyChanged";
ORYX.CONFIG.EVENT_LAYOUT_ROWS = "layout.rows";
ORYX.CONFIG.EVENT_LAYOUT_BPEL = "layout.BPEL";
ORYX.CONFIG.EVENT_LAYOUT_BPEL_VERTICAL = "layout.BPEL.vertical";
ORYX.CONFIG.EVENT_LAYOUT_BPEL_HORIZONTAL = "layout.BPEL.horizontal";
ORYX.CONFIG.EVENT_LAYOUT_BPEL_SINGLECHILD = "layout.BPEL.singlechild";
ORYX.CONFIG.EVENT_LAYOUT_BPEL_AUTORESIZE = "layout.BPEL.autoresize";
ORYX.CONFIG.EVENT_AUTOLAYOUT_LAYOUT = "autolayout.layout";
ORYX.CONFIG.EVENT_UNDO_EXECUTE = "undo.execute";
ORYX.CONFIG.EVENT_UNDO_ROLLBACK = "undo.rollback";
ORYX.CONFIG.EVENT_BUTTON_UPDATE = "toolbar.button.update";
ORYX.CONFIG.EVENT_LAYOUT = "layout.dolayout";
ORYX.CONFIG.EVENT_GLOSSARY_LINK_EDIT = "glossary.link.edit";
ORYX.CONFIG.EVENT_GLOSSARY_SHOW = "glossary.show.info";
ORYX.CONFIG.EVENT_GLOSSARY_NEW = "glossary.show.new";
ORYX.CONFIG.EVENT_DOCKERDRAG = "dragTheDocker";
ORYX.CONFIG.EVENT_CANVAS_SCROLL = "canvas.scroll";
ORYX.CONFIG.EVENT_SHOW_PROPERTYWINDOW = "propertywindow.show";
ORYX.CONFIG.EVENT_ABOUT_TO_SAVE = "file.aboutToSave";
ORYX.CONFIG.SELECTION_HIGHLIGHT_SIZE = 5;
ORYX.CONFIG.SELECTION_HIGHLIGHT_COLOR = "#4444FF";
ORYX.CONFIG.SELECTION_HIGHLIGHT_COLOR2 = "#9999FF";
ORYX.CONFIG.SELECTION_HIGHLIGHT_STYLE_CORNER = "corner";
ORYX.CONFIG.SELECTION_HIGHLIGHT_STYLE_RECTANGLE = "rectangle";
ORYX.CONFIG.SELECTION_VALID_COLOR = "#00FF00";
ORYX.CONFIG.SELECTION_INVALID_COLOR = "#FF0000";
ORYX.CONFIG.DOCKER_DOCKED_COLOR = "#00FF00";
ORYX.CONFIG.DOCKER_UNDOCKED_COLOR = "#FF0000";
ORYX.CONFIG.DOCKER_SNAP_OFFSET = 10;
ORYX.CONFIG.EDIT_OFFSET_PASTE = 10;
ORYX.CONFIG.KEY_CODE_X = 88;
ORYX.CONFIG.KEY_CODE_C = 67;
ORYX.CONFIG.KEY_CODE_V = 86;
ORYX.CONFIG.KEY_CODE_DELETE = 46;
ORYX.CONFIG.KEY_CODE_META = 224;
ORYX.CONFIG.KEY_CODE_BACKSPACE = 8;
ORYX.CONFIG.KEY_CODE_LEFT = 37;
ORYX.CONFIG.KEY_CODE_RIGHT = 39;
ORYX.CONFIG.KEY_CODE_UP = 38;
ORYX.CONFIG.KEY_CODE_DOWN = 40;
ORYX.CONFIG.KEY_Code_enter = 12;
ORYX.CONFIG.KEY_Code_left = 37;
ORYX.CONFIG.KEY_Code_right = 39;
ORYX.CONFIG.KEY_Code_top = 38;
ORYX.CONFIG.KEY_Code_bottom = 40;
ORYX.CONFIG.META_KEY_META_CTRL = "metactrl";
ORYX.CONFIG.META_KEY_ALT = "alt";
ORYX.CONFIG.META_KEY_SHIFT = "shift";
ORYX.CONFIG.KEY_ACTION_DOWN = "down";
ORYX.CONFIG.KEY_ACTION_UP = "up";
ORYX.CONFIG.FORM_ROW_WIDTH = 350;
ORYX.CONFIG.FORM_GROUP_MARGIN = 5;
ORYX.CONFIG.FORM_GROUP_EMPTY_HEIGHT = 100;
ORYX.CONFIG.FORM_ELEMENT_ID_PREFIX = "http://b3mn.org/stencilset/xforms";
ORYX.CONFIG.FORM_ELEMENT_TYPE_ROOT = "http://b3mn.org/stencilset/xforms#XForm";
ORYX.CONFIG.FORM_ELEMENT_TYPE_GROUP = "http://b3mn.org/stencilset/xforms#Group";
ORYX.CONFIG.FORM_ELEMENT_TYPE_REPEATING_GROUP = "http://b3mn.org/stencilset/xforms#RepeatingGroup";
ORYX.CONFIG.FORM_ELEMENT_TYPE_LABEL_FIELD = "http://b3mn.org/stencilset/xforms#LabelField";

function printf() {
    var a = arguments[0];
    for (var b = 1; b < arguments.length; b++) {
        a = a.replace("%" + (b - 1), arguments[b])
    }
    return a
}

var ORYX_LOGLEVEL_TRACE = 5;
var ORYX_LOGLEVEL_DEBUG = 4;
var ORYX_LOGLEVEL_INFO = 3;
var ORYX_LOGLEVEL_WARN = 2;
var ORYX_LOGLEVEL_ERROR = 1;
var ORYX_LOGLEVEL_FATAL = 0;
var ORYX_LOGLEVEL = 3;
var ORYX_CONFIGURATION_DELAY = 100;
var ORYX_CONFIGURATION_WAIT_ATTEMPTS = 10;
if (!ORYX) {
    var ORYX = {}
}
ORYX = Object.extend(ORYX, {
    PATH: ORYX.CONFIG.ROOT_PATH,
    URLS: [],
    alreadyLoaded: [],
    configrationRetries: 0,
    Version: "0.1.1",
    availablePlugins: [],
    Log: {
        __appenders: [{
            append: function (a) {
                if (typeof (console) !== "undefined" && console.log !== undefined) {
                    console.log(a)
                }
            }
        }], trace: function () {
            if (ORYX_LOGLEVEL >= ORYX_LOGLEVEL_TRACE) {
                ORYX.Log.__log("TRACE", arguments)
            }
        }, debug: function () {
            if (ORYX_LOGLEVEL >= ORYX_LOGLEVEL_DEBUG) {
                ORYX.Log.__log("DEBUG", arguments)
            }
        }, info: function () {
            if (ORYX_LOGLEVEL >= ORYX_LOGLEVEL_INFO) {
                ORYX.Log.__log("INFO", arguments)
            }
        }, warn: function () {
            if (ORYX_LOGLEVEL >= ORYX_LOGLEVEL_WARN) {
                ORYX.Log.__log("WARN", arguments)
            }
        }, error: function () {
            if (ORYX_LOGLEVEL >= ORYX_LOGLEVEL_ERROR) {
                ORYX.Log.__log("ERROR", arguments)
            }
        }, fatal: function () {
            if (ORYX_LOGLEVEL >= ORYX_LOGLEVEL_FATAL) {
                ORYX.Log.__log("FATAL", arguments)
            }
        }, __log: function (c, a) {
            a[0] = (new Date()).getTime() + " " + c + " " + a[0];
            var b = printf.apply(null, a);
            ORYX.Log.__appenders.each(function (d) {
                d.append(b)
            })
        }, addAppender: function (a) {
            ORYX.Log.__appenders.push(a)
        }
    },
    load: function () {
        ORYX.Log.debug("Oryx begins loading procedure.");
        if ((typeof Prototype == "undefined") || (typeof Element == "undefined") || (typeof Element.Methods == "undefined") || parseFloat(Prototype.Version.split(".")[0] + "." + Prototype.Version.split(".")[1]) < 1.5) {
            throw ("Application requires the Prototype JavaScript framework >= 1.5.3")
        }
        ORYX.Log.debug("Prototype > 1.5 found.");
        ORYX._load()
    },
    _load: function () {
        ORYX.loadPlugins()
    },
    loadPlugins: function () {
        if (ORYX.CONFIG.PLUGINS_ENABLED) {
            ORYX._loadPlugins()
        } else {
            ORYX.Log.warn("Ignoring plugins, loading Core only.")
        }
        init()
    },
    _loadPlugins: function () {
        var a = ORYX.CONFIG.PLUGINS_CONFIG;
        ORYX.Log.debug("Loading plugin configuration from '%0'.", a);
        new Ajax.Request(a, {
            asynchronous: false, method: "get", onSuccess: function (c) {
                ORYX.Log.info("Plugin configuration file loaded.");
                var f = c.responseXML;
                var b = [];
                var d = $A(f.getElementsByTagName("properties"));
                d.each(function (h) {
                    var g = $A(h.childNodes);
                    g.each(function (m) {
                        var l = new Hash();
                        var k = $A(m.attributes);
                        k.each(function (n) {
                            l[n.nodeName] = n.nodeValue
                        });
                        if (k.length > 0) {
                            b.push(l)
                        }
                    })
                });
                var e = f.getElementsByTagName("plugin");
                $A(e).each(function (k) {
                    var p = new Hash();
                    $A(k.attributes).each(function (r) {
                        p[r.nodeName] = r.nodeValue
                    });
                    if (!p.name) {
                        ORYX.Log.error("A plugin is not providing a name. Ingnoring this plugin.");
                        return
                    }
                    if (!p.source) {
                        ORYX.Log.error("Plugin with name '%0' doesn't provide a source attribute.", p.name);
                        return
                    }
                    var n = k.getElementsByTagName("property");
                    var o = [];
                    $A(n).each(function (t) {
                        var s = new Hash();
                        var r = $A(t.attributes);
                        r.each(function (u) {
                            s[u.nodeName] = u.nodeValue
                        });
                        if (r.length > 0) {
                            o.push(s)
                        }
                    });
                    o = o.concat(b);
                    p.properties = o;
                    var l = k.getElementsByTagName("requires");
                    var q;
                    $A(l).each(function (s) {
                        var r = $A(s.attributes).find(function (t) {
                            return t.name == "namespace"
                        });
                        if (r && r.nodeValue) {
                            if (!q) {
                                q = {namespaces: []}
                            }
                            q.namespaces.push(r.nodeValue)
                        }
                    });
                    if (q) {
                        p.requires = q
                    }
                    var m = k.getElementsByTagName("notUsesIn");
                    var h;
                    $A(m).each(function (s) {
                        var r = $A(s.attributes).find(function (t) {
                            return t.name == "namespace"
                        });
                        if (r && r.nodeValue) {
                            if (!h) {
                                h = {namespaces: []}
                            }
                            h.namespaces.push(r.nodeValue)
                        }
                    });
                    if (h) {
                        p.notUsesIn = h
                    }
                    var g = ORYX.PATH + ORYX.CONFIG.PLUGINS_FOLDER + p.source;
                    ORYX.Log.debug("Requireing '%0'", g);
                    ORYX.Log.info("Plugin '%0' successfully loaded.", p.name);
                    ORYX.availablePlugins.push(p)
                })
            }, onFailure: this._loadPluginsOnFails
        })
    },
    _loadPluginsOnFails: function (a) {
        ORYX.Log.error("Plugin configuration file not available.")
    }
});
if (!ORYX) {
    var ORYX = {}
}
if (!ORYX.Core) {
    ORYX.Core = {}
}
if (!ORYX.Core.SVG) {
    ORYX.Core.SVG = {}
}
ORYX.Core.SVG.EditPathHandler = Clazz.extend({
    construct: function () {
        arguments.callee.$.construct.apply(this, arguments);
        this.x = 0;
        this.y = 0;
        this.oldX = 0;
        this.oldY = 0;
        this.deltaWidth = 1;
        this.deltaHeight = 1;
        this.d = ""
    }, init: function (a, f, d, b, c, e) {
        this.x = a;
        this.y = f;
        this.oldX = d;
        this.oldY = b;
        this.deltaWidth = c;
        this.deltaHeight = e;
        this.d = ""
    }, editPointsAbs: function (c) {
        if (c instanceof Array) {
            var d = [];
            var a, e;
            for (var b = 0; b < c.length; b++) {
                a = (parseFloat(c[b]) - this.oldX) * this.deltaWidth + this.x;
                b++;
                e = (parseFloat(c[b]) - this.oldY) * this.deltaHeight + this.y;
                d.push(a);
                d.push(e)
            }
            return d
        } else {
        }
    }, editPointsRel: function (c) {
        if (c instanceof Array) {
            var d = [];
            var a, e;
            for (var b = 0; b < c.length; b++) {
                a = parseFloat(c[b]) * this.deltaWidth;
                b++;
                e = parseFloat(c[b]) * this.deltaHeight;
                d.push(a);
                d.push(e)
            }
            return d
        } else {
        }
    }, arcAbs: function (e, c, k, b, f, h, g) {
        var d = this.editPointsAbs([h, g]);
        var a = this.editPointsRel([e, c]);
        this.d = this.d.concat(" A" + a[0] + " " + a[1] + " " + k + " " + b + " " + f + " " + d[0] + " " + d[1] + " ")
    }, arcRel: function (f, d, b, e, c, a, h) {
        var g = this.editPointsRel([f, d, a, h]);
        this.d = this.d.concat(" a" + g[0] + " " + g[1] + " " + b + " " + e + " " + c + " " + g[2] + " " + g[3] + " ")
    }, curvetoCubicAbs: function (c, e, b, d, a, g) {
        var f = this.editPointsAbs([c, e, b, d, a, g]);
        this.d = this.d.concat(" C" + f[0] + " " + f[1] + " " + f[2] + " " + f[3] + " " + f[4] + " " + f[5] + " ")
    }, curvetoCubicRel: function (c, e, b, d, a, g) {
        var f = this.editPointsRel([c, e, b, d, a, g]);
        this.d = this.d.concat(" c" + f[0] + " " + f[1] + " " + f[2] + " " + f[3] + " " + f[4] + " " + f[5] + " ")
    }, linetoHorizontalAbs: function (a) {
        var b = this.editPointsAbs([a, 0]);
        this.d = this.d.concat(" H" + b[0] + " ")
    }, linetoHorizontalRel: function (a) {
        var b = this.editPointsRel([a, 0]);
        this.d = this.d.concat(" h" + b[0] + " ")
    }, linetoAbs: function (a, c) {
        var b = this.editPointsAbs([a, c]);
        this.d = this.d.concat(" L" + b[0] + " " + b[1] + " ")
    }, linetoRel: function (a, c) {
        var b = this.editPointsRel([a, c]);
        this.d = this.d.concat(" l" + b[0] + " " + b[1] + " ")
    }, movetoAbs: function (a, c) {
        var b = this.editPointsAbs([a, c]);
        this.d = this.d.concat(" M" + b[0] + " " + b[1] + " ")
    }, movetoRel: function (a, c) {
        var b;
        if (this.d === "") {
            b = this.editPointsAbs([a, c])
        } else {
            b = this.editPointsRel([a, c])
        }
        this.d = this.d.concat(" m" + b[0] + " " + b[1] + " ")
    }, curvetoQuadraticAbs: function (b, c, a, e) {
        var d = this.editPointsAbs([b, c, a, e]);
        this.d = this.d.concat(" Q" + d[0] + " " + d[1] + " " + d[2] + " " + d[3] + " ")
    }, curvetoQuadraticRel: function (b, c, a, e) {
        var d = this.editPointsRel([b, c, a, e]);
        this.d = this.d.concat(" q" + d[0] + " " + d[1] + " " + d[2] + " " + d[3] + " ")
    }, curvetoCubicSmoothAbs: function (b, c, a, e) {
        var d = this.editPointsAbs([b, c, a, e]);
        this.d = this.d.concat(" S" + d[0] + " " + d[1] + " " + d[2] + " " + d[3] + " ")
    }, curvetoCubicSmoothRel: function (b, c, a, e) {
        var d = this.editPointsRel([b, c, a, e]);
        this.d = this.d.concat(" s" + d[0] + " " + d[1] + " " + d[2] + " " + d[3] + " ")
    }, curvetoQuadraticSmoothAbs: function (a, c) {
        var b = this.editPointsAbs([a, c]);
        this.d = this.d.concat(" T" + b[0] + " " + b[1] + " ")
    }, curvetoQuadraticSmoothRel: function (a, c) {
        var b = this.editPointsRel([a, c]);
        this.d = this.d.concat(" t" + b[0] + " " + b[1] + " ")
    }, linetoVerticalAbs: function (b) {
        var a = this.editPointsAbs([0, b]);
        this.d = this.d.concat(" V" + a[1] + " ")
    }, linetoVerticalRel: function (b) {
        var a = this.editPointsRel([0, b]);
        this.d = this.d.concat(" v" + a[1] + " ")
    }, closePath: function () {
        this.d = this.d.concat(" z")
    }
});
if (!ORYX) {
    var ORYX = {}
}
if (!ORYX.Core) {
    ORYX.Core = {}
}
if (!ORYX.Core.SVG) {
    ORYX.Core.SVG = {}
}
ORYX.Core.SVG.MinMaxPathHandler = Clazz.extend({
    construct: function () {
        arguments.callee.$.construct.apply(this, arguments);
        this.minX = undefined;
        this.minY = undefined;
        this.maxX = undefined;
        this.maxY = undefined;
        this._lastAbsX = undefined;
        this._lastAbsY = undefined
    }, calculateMinMax: function (c) {
        if (c instanceof Array) {
            var a, d;
            for (var b = 0; b < c.length; b++) {
                a = parseFloat(c[b]);
                b++;
                d = parseFloat(c[b]);
                this.minX = (this.minX !== undefined) ? Math.min(this.minX, a) : a;
                this.maxX = (this.maxX !== undefined) ? Math.max(this.maxX, a) : a;
                this.minY = (this.minY !== undefined) ? Math.min(this.minY, d) : d;
                this.maxY = (this.maxY !== undefined) ? Math.max(this.maxY, d) : d;
                this._lastAbsX = a;
                this._lastAbsY = d
            }
        } else {
        }
    }, arcAbs: function (f, d, b, e, c, a, g) {
        this.calculateMinMax([a, g])
    }, arcRel: function (f, d, b, e, c, a, g) {
        this.calculateMinMax([this._lastAbsX + a, this._lastAbsY + g])
    }, curvetoCubicAbs: function (c, e, b, d, a, f) {
        this.calculateMinMax([c, e, b, d, a, f])
    }, curvetoCubicRel: function (c, e, b, d, a, f) {
        this.calculateMinMax([this._lastAbsX + c, this._lastAbsY + e, this._lastAbsX + b, this._lastAbsY + d, this._lastAbsX + a, this._lastAbsY + f])
    }, linetoHorizontalAbs: function (a) {
        this.calculateMinMax([a, this._lastAbsY])
    }, linetoHorizontalRel: function (a) {
        this.calculateMinMax([this._lastAbsX + a, this._lastAbsY])
    }, linetoAbs: function (a, b) {
        this.calculateMinMax([a, b])
    }, linetoRel: function (a, b) {
        this.calculateMinMax([this._lastAbsX + a, this._lastAbsY + b])
    }, movetoAbs: function (a, b) {
        this.calculateMinMax([a, b])
    }, movetoRel: function (a, b) {
        if (this._lastAbsX && this._lastAbsY) {
            this.calculateMinMax([this._lastAbsX + a, this._lastAbsY + b])
        } else {
            this.calculateMinMax([a, b])
        }
    }, curvetoQuadraticAbs: function (b, c, a, d) {
        this.calculateMinMax([b, c, a, d])
    }, curvetoQuadraticRel: function (b, c, a, d) {
        this.calculateMinMax([this._lastAbsX + b, this._lastAbsY + c, this._lastAbsX + a, this._lastAbsY + d])
    }, curvetoCubicSmoothAbs: function (b, c, a, d) {
        this.calculateMinMax([b, c, a, d])
    }, curvetoCubicSmoothRel: function (b, c, a, d) {
        this.calculateMinMax([this._lastAbsX + b, this._lastAbsY + c, this._lastAbsX + a, this._lastAbsY + d])
    }, curvetoQuadraticSmoothAbs: function (a, b) {
        this.calculateMinMax([a, b])
    }, curvetoQuadraticSmoothRel: function (a, b) {
        this.calculateMinMax([this._lastAbsX + a, this._lastAbsY + b])
    }, linetoVerticalAbs: function (a) {
        this.calculateMinMax([this._lastAbsX, a])
    }, linetoVerticalRel: function (a) {
        this.calculateMinMax([this._lastAbsX, this._lastAbsY + a])
    }, closePath: function () {
        return
    }
});
if (!ORYX) {
    var ORYX = {}
}
if (!ORYX.Core) {
    ORYX.Core = {}
}
if (!ORYX.Core.SVG) {
    ORYX.Core.SVG = {}
}
ORYX.Core.SVG.PointsPathHandler = Clazz.extend({
    construct: function () {
        arguments.callee.$.construct.apply(this, arguments);
        this.points = [];
        this._lastAbsX = undefined;
        this._lastAbsY = undefined
    }, addPoints: function (c) {
        if (c instanceof Array) {
            var a, d;
            for (var b = 0; b < c.length; b++) {
                a = parseFloat(c[b]);
                b++;
                d = parseFloat(c[b]);
                this.points.push(a);
                this.points.push(d);
                this._lastAbsX = a;
                this._lastAbsY = d
            }
        } else {
        }
    }, arcAbs: function (f, d, b, e, c, a, g) {
        this.addPoints([a, g])
    }, arcRel: function (f, d, b, e, c, a, g) {
        this.addPoints([this._lastAbsX + a, this._lastAbsY + g])
    }, curvetoCubicAbs: function (c, e, b, d, a, f) {
        this.addPoints([a, f])
    }, curvetoCubicRel: function (c, e, b, d, a, f) {
        this.addPoints([this._lastAbsX + a, this._lastAbsY + f])
    }, linetoHorizontalAbs: function (a) {
        this.addPoints([a, this._lastAbsY])
    }, linetoHorizontalRel: function (a) {
        this.addPoints([this._lastAbsX + a, this._lastAbsY])
    }, linetoAbs: function (a, b) {
        this.addPoints([a, b])
    }, linetoRel: function (a, b) {
        this.addPoints([this._lastAbsX + a, this._lastAbsY + b])
    }, movetoAbs: function (a, b) {
        this.addPoints([a, b])
    }, movetoRel: function (a, b) {
        if (this._lastAbsX && this._lastAbsY) {
            this.addPoints([this._lastAbsX + a, this._lastAbsY + b])
        } else {
            this.addPoints([a, b])
        }
    }, curvetoQuadraticAbs: function (b, c, a, d) {
        this.addPoints([a, d])
    }, curvetoQuadraticRel: function (b, c, a, d) {
        this.addPoints([this._lastAbsX + a, this._lastAbsY + d])
    }, curvetoCubicSmoothAbs: function (b, c, a, d) {
        this.addPoints([a, d])
    }, curvetoCubicSmoothRel: function (b, c, a, d) {
        this.addPoints([this._lastAbsX + a, this._lastAbsY + d])
    }, curvetoQuadraticSmoothAbs: function (a, b) {
        this.addPoints([a, b])
    }, curvetoQuadraticSmoothRel: function (a, b) {
        this.addPoints([this._lastAbsX + a, this._lastAbsY + b])
    }, linetoVerticalAbs: function (a) {
        this.addPoints([this._lastAbsX, a])
    }, linetoVerticalRel: function (a) {
        this.addPoints([this._lastAbsX, this._lastAbsY + a])
    }, closePath: function () {
        return
    }
});
NAMESPACE_ORYX = "http://www.b3mn.org/oryx";
NAMESPACE_SVG = "http://www.w3.org/2000/svg/";
if (!ORYX) {
    var ORYX = {}
}
if (!ORYX.Core) {
    ORYX.Core = {}
}
if (!ORYX.Core.SVG) {
    ORYX.Core.SVG = {}
}
ORYX.Core.SVG.SVGMarker = Clazz.extend({
    construct: function (a) {
        arguments.callee.$.construct.apply(this, arguments);
        this.id = undefined;
        this.element = a;
        this.refX = undefined;
        this.refY = undefined;
        this.markerWidth = undefined;
        this.markerHeight = undefined;
        this.oldRefX = undefined;
        this.oldRefY = undefined;
        this.oldMarkerWidth = undefined;
        this.oldMarkerHeight = undefined;
        this.optional = false;
        this.enabled = true;
        this.minimumLength = undefined;
        this.resize = false;
        this.svgShapes = [];
        this._init()
    }, _init: function () {
        if (!(this.element == "[object SVGMarkerElement]")) {
            throw"SVGMarker: Argument is not an instance of SVGMarkerElement."
        }
        this.id = this.element.getAttributeNS(null, "id");
        var a = this.element.getAttributeNS(null, "refX");
        if (a) {
            this.refX = parseFloat(a)
        } else {
            this.refX = 0
        }
        var h = this.element.getAttributeNS(null, "refY");
        if (h) {
            this.refY = parseFloat(h)
        } else {
            this.refY = 0
        }
        var f = this.element.getAttributeNS(null, "markerWidth");
        if (f) {
            this.markerWidth = parseFloat(f)
        } else {
            this.markerWidth = 3
        }
        var c = this.element.getAttributeNS(null, "markerHeight");
        if (c) {
            this.markerHeight = parseFloat(c)
        } else {
            this.markerHeight = 3
        }
        this.oldRefX = this.refX;
        this.oldRefY = this.refY;
        this.oldMarkerWidth = this.markerWidth;
        this.oldMarkerHeight = this.markerHeight;
        var g = this.element.getAttributeNS(NAMESPACE_ORYX, "optional");
        if (g) {
            g = g.strip();
            this.optional = (g.toLowerCase() === "yes")
        } else {
            this.optional = false
        }
        var e = this.element.getAttributeNS(NAMESPACE_ORYX, "enabled");
        if (e) {
            e = e.strip();
            this.enabled = !(e.toLowerCase() === "no")
        } else {
            this.enabled = true
        }
        var d = this.element.getAttributeNS(NAMESPACE_ORYX, "minimumLength");
        if (d) {
            this.minimumLength = parseFloat(d)
        }
        var b = this.element.getAttributeNS(NAMESPACE_ORYX, "resize");
        if (b) {
            b = b.strip();
            this.resize = (b.toLowerCase() === "yes")
        } else {
            this.resize = false
        }
    }, _getSVGShapes: function (c) {
        if (c.hasChildNodes) {
            var a = [];
            var b = this;
            $A(c.childNodes).each(function (d) {
                try {
                    var g = new ORYX.Core.SVG.SVGShape(d);
                    a.push(g)
                } catch (f) {
                    a = a.concat(b._getSVGShapes(d))
                }
            });
            return a
        }
    }, update: function () {
        this.oldRefX = this.refX;
        this.oldRefY = this.refY;
        this.oldMarkerWidth = this.markerWidth;
        this.oldMarkerHeight = this.markerHeight
    }, toString: function () {
        return (this.element) ? "SVGMarker " + this.element.id : "SVGMarker " + this.element
    }
});
NAMESPACE_ORYX = "http://www.b3mn.org/oryx";
NAMESPACE_SVG = "http://www.w3.org/2000/svg/";
if (!ORYX) {
    var ORYX = {}
}
if (!ORYX.Core) {
    ORYX.Core = {}
}
if (!ORYX.Core.SVG) {
    ORYX.Core.SVG = {}
}
ORYX.Core.SVG.SVGShape = Clazz.extend({
    construct: function (a) {
        arguments.callee.$.construct.apply(this, arguments);
        this.type;
        this.element = a;
        this.x = undefined;
        this.y = undefined;
        this.width = undefined;
        this.height = undefined;
        this.oldX = undefined;
        this.oldY = undefined;
        this.oldWidth = undefined;
        this.oldHeight = undefined;
        this.radiusX = undefined;
        this.radiusY = undefined;
        this.isHorizontallyResizable = false;
        this.isVerticallyResizable = false;
        this.anchorLeft = false;
        this.anchorRight = false;
        this.anchorTop = false;
        this.anchorBottom = false;
        this.allowDockers = true;
        this.resizeMarkerMid = false;
        this.editPathParser;
        this.editPathHandler;
        this.init()
    }, init: function () {
        if (ORYX.Editor.checkClassType(this.element, SVGRectElement) || ORYX.Editor.checkClassType(this.element, SVGImageElement)) {
            this.type = "Rect";
            var I = this.element.getAttributeNS(null, "x");
            if (I) {
                this.oldX = parseFloat(I)
            } else {
                throw"Missing attribute in element " + this.element
            }
            var p = this.element.getAttributeNS(null, "y");
            if (p) {
                this.oldY = parseFloat(p)
            } else {
                throw"Missing attribute in element " + this.element
            }
            var r = this.element.getAttributeNS(null, "width");
            if (r) {
                this.oldWidth = parseFloat(r)
            } else {
                throw"Missing attribute in element " + this.element
            }
            var u = this.element.getAttributeNS(null, "height");
            if (u) {
                this.oldHeight = parseFloat(u)
            } else {
                throw"Missing attribute in element " + this.element
            }
        } else {
            if (ORYX.Editor.checkClassType(this.element, SVGCircleElement)) {
                this.type = "Circle";
                var h = undefined;
                var e = undefined;
                var a = this.element.getAttributeNS(null, "cx");
                if (a) {
                    h = parseFloat(a)
                } else {
                    throw"Missing attribute in element " + this.element
                }
                var w = this.element.getAttributeNS(null, "cy");
                if (w) {
                    e = parseFloat(w)
                } else {
                    throw"Missing attribute in element " + this.element
                }
                var k = this.element.getAttributeNS(null, "r");
                if (k) {
                    this.radiusX = parseFloat(k)
                } else {
                    throw"Missing attribute in element " + this.element
                }
                this.oldX = h - this.radiusX;
                this.oldY = e - this.radiusX;
                this.oldWidth = 2 * this.radiusX;
                this.oldHeight = 2 * this.radiusX
            } else {
                if (ORYX.Editor.checkClassType(this.element, SVGEllipseElement)) {
                    this.type = "Ellipse";
                    var h = undefined;
                    var e = undefined;
                    var a = this.element.getAttributeNS(null, "cx");
                    if (a) {
                        h = parseFloat(a)
                    } else {
                        throw"Missing attribute in element " + this.element
                    }
                    var w = this.element.getAttributeNS(null, "cy");
                    if (w) {
                        e = parseFloat(w)
                    } else {
                        throw"Missing attribute in element " + this.element
                    }
                    var J = this.element.getAttributeNS(null, "rx");
                    if (J) {
                        this.radiusX = parseFloat(J)
                    } else {
                        throw"Missing attribute in element " + this.element
                    }
                    var q = this.element.getAttributeNS(null, "ry");
                    if (q) {
                        this.radiusY = parseFloat(q)
                    } else {
                        throw"Missing attribute in element " + this.element
                    }
                    this.oldX = h - this.radiusX;
                    this.oldY = e - this.radiusY;
                    this.oldWidth = 2 * this.radiusX;
                    this.oldHeight = 2 * this.radiusY
                } else {
                    if (ORYX.Editor.checkClassType(this.element, SVGLineElement)) {
                        this.type = "Line";
                        var C = undefined;
                        var g = undefined;
                        var A = undefined;
                        var d = undefined;
                        var H = this.element.getAttributeNS(null, "x1");
                        if (H) {
                            C = parseFloat(H)
                        } else {
                            throw"Missing attribute in element " + this.element
                        }
                        var b = this.element.getAttributeNS(null, "y1");
                        if (b) {
                            g = parseFloat(b)
                        } else {
                            throw"Missing attribute in element " + this.element
                        }
                        var m = this.element.getAttributeNS(null, "x2");
                        if (m) {
                            A = parseFloat(m)
                        } else {
                            throw"Missing attribute in element " + this.element
                        }
                        var v = this.element.getAttributeNS(null, "y2");
                        if (v) {
                            d = parseFloat(v)
                        } else {
                            throw"Missing attribute in element " + this.element
                        }
                        this.oldX = Math.min(C, A);
                        this.oldY = Math.min(g, d);
                        this.oldWidth = Math.abs(C - A);
                        this.oldHeight = Math.abs(g - d)
                    } else {
                        if (ORYX.Editor.checkClassType(this.element, SVGPolylineElement) || ORYX.Editor.checkClassType(this.element, SVGPolygonElement)) {
                            this.type = "Polyline";
                            var n = [];
                            if (this.element.points && this.element.points.numberOfItems) {
                                for (var z = 0, s = this.element.points.numberOfItems; z < s; z++) {
                                    n.push(this.element.points.getItem(z).x);
                                    n.push(this.element.points.getItem(z).y)
                                }
                            } else {
                                var y = this.element.getAttributeNS(null, "points");
                                if (y) {
                                    y = y.replace(/,/g, " ");
                                    n = y.split(" ");
                                    n = n.without("")
                                } else {
                                    throw"Missing attribute in element " + this.element
                                }
                            }
                            if (n && n.length && n.length > 1) {
                                var G = parseFloat(n[0]);
                                var F = parseFloat(n[1]);
                                var E = parseFloat(n[0]);
                                var D = parseFloat(n[1]);
                                for (var z = 0; z < n.length; z++) {
                                    G = Math.min(G, parseFloat(n[z]));
                                    E = Math.max(E, parseFloat(n[z]));
                                    z++;
                                    F = Math.min(F, parseFloat(n[z]));
                                    D = Math.max(D, parseFloat(n[z]))
                                }
                                this.oldX = G;
                                this.oldY = F;
                                this.oldWidth = E - G;
                                this.oldHeight = D - F
                            } else {
                                throw"Missing attribute in element " + this.element
                            }
                        } else {
                            if (ORYX.Editor.checkClassType(this.element, SVGPathElement)) {
                                this.type = "Path";
                                this.editPathParser = new PathParser();
                                this.editPathHandler = new ORYX.Core.SVG.EditPathHandler();
                                this.editPathParser.setHandler(this.editPathHandler);
                                var f = new PathParser();
                                var c = new ORYX.Core.SVG.MinMaxPathHandler();
                                f.setHandler(c);
                                f.parsePath(this.element);
                                this.oldX = c.minX;
                                this.oldY = c.minY;
                                this.oldWidth = c.maxX - c.minX;
                                this.oldHeight = c.maxY - c.minY;
                                delete f;
                                delete c
                            } else {
                                throw"Element is not a shape."
                            }
                        }
                    }
                }
            }
        }
        var t = this.element.getAttributeNS(NAMESPACE_ORYX, "resize");
        if (t) {
            t = t.toLowerCase();
            if (t.match(/horizontal/)) {
                this.isHorizontallyResizable = true
            } else {
                this.isHorizontallyResizable = false
            }
            if (t.match(/vertical/)) {
                this.isVerticallyResizable = true
            } else {
                this.isVerticallyResizable = false
            }
        } else {
            this.isHorizontallyResizable = false;
            this.isVerticallyResizable = false
        }
        var x = this.element.getAttributeNS(NAMESPACE_ORYX, "anchors");
        if (x) {
            x = x.replace("/,/g", " ");
            var o = x.split(" ").without("");
            for (var z = 0; z < o.length; z++) {
                switch (o[z].toLowerCase()) {
                    case"left":
                        this.anchorLeft = true;
                        break;
                    case"right":
                        this.anchorRight = true;
                        break;
                    case"top":
                        this.anchorTop = true;
                        break;
                    case"bottom":
                        this.anchorBottom = true;
                        break
                }
            }
        }
        if (ORYX.Editor.checkClassType(this.element, SVGPathElement)) {
            var l = this.element.getAttributeNS(NAMESPACE_ORYX, "allowDockers");
            if (l) {
                if (l.toLowerCase() === "no") {
                    this.allowDockers = false
                } else {
                    this.allowDockers = true
                }
            }
            var B = this.element.getAttributeNS(NAMESPACE_ORYX, "resizeMarker-mid");
            if (B) {
                if (B.toLowerCase() === "yes") {
                    this.resizeMarkerMid = true
                } else {
                    this.resizeMarkerMid = false
                }
            }
        }
        this.x = this.oldX;
        this.y = this.oldY;
        this.width = this.oldWidth;
        this.height = this.oldHeight
    }, update: function () {
        if (this.x !== this.oldX || this.y !== this.oldY || this.width !== this.oldWidth || this.height !== this.oldHeight) {
            switch (this.type) {
                case"Rect":
                    if (this.x !== this.oldX) {
                        this.element.setAttributeNS(null, "x", this.x)
                    }
                    if (this.y !== this.oldY) {
                        this.element.setAttributeNS(null, "y", this.y)
                    }
                    if (this.width !== this.oldWidth) {
                        this.element.setAttributeNS(null, "width", this.width)
                    }
                    if (this.height !== this.oldHeight) {
                        this.element.setAttributeNS(null, "height", this.height)
                    }
                    break;
                case"Circle":
                    this.radiusX = ((this.width < this.height) ? this.width : this.height) / 2;
                    this.element.setAttributeNS(null, "cx", this.x + this.width / 2);
                    this.element.setAttributeNS(null, "cy", this.y + this.height / 2);
                    this.element.setAttributeNS(null, "r", this.radiusX);
                    break;
                case"Ellipse":
                    this.radiusX = this.width / 2;
                    this.radiusY = this.height / 2;
                    this.element.setAttributeNS(null, "cx", this.x + this.radiusX);
                    this.element.setAttributeNS(null, "cy", this.y + this.radiusY);
                    this.element.setAttributeNS(null, "rx", this.radiusX);
                    this.element.setAttributeNS(null, "ry", this.radiusY);
                    break;
                case"Line":
                    if (this.x !== this.oldX) {
                        this.element.setAttributeNS(null, "x1", this.x)
                    }
                    if (this.y !== this.oldY) {
                        this.element.setAttributeNS(null, "y1", this.y)
                    }
                    if (this.x !== this.oldX || this.width !== this.oldWidth) {
                        this.element.setAttributeNS(null, "x2", this.x + this.width)
                    }
                    if (this.y !== this.oldY || this.height !== this.oldHeight) {
                        this.element.setAttributeNS(null, "y2", this.y + this.height)
                    }
                    break;
                case"Polyline":
                    var d = this.element.getAttributeNS(null, "points");
                    if (d) {
                        d = d.replace(/,/g, " ").split(" ").without("");
                        if (d && d.length && d.length > 1) {
                            var g = (this.oldWidth === 0) ? 0 : this.width / this.oldWidth;
                            var e = (this.oldHeight === 0) ? 0 : this.height / this.oldHeight;
                            var b = "";
                            for (var c = 0; c < d.length; c++) {
                                var a = (parseFloat(d[c]) - this.oldX) * g + this.x;
                                c++;
                                var f = (parseFloat(d[c]) - this.oldY) * e + this.y;
                                b += a + " " + f + " "
                            }
                            this.element.setAttributeNS(null, "points", b)
                        } else {
                        }
                    } else {
                    }
                    break;
                case"Path":
                    var g = (this.oldWidth === 0) ? 0 : this.width / this.oldWidth;
                    var e = (this.oldHeight === 0) ? 0 : this.height / this.oldHeight;
                    this.editPathHandler.init(this.x, this.y, this.oldX, this.oldY, g, e);
                    this.editPathParser.parsePath(this.element);
                    this.element.setAttributeNS(null, "d", this.editPathHandler.d);
                    break
            }
            this.oldX = this.x;
            this.oldY = this.y;
            this.oldWidth = this.width;
            this.oldHeight = this.height
        }
        delete this.visible;
        delete this.handler
    }, isPointIncluded: function (d, b) {
        if (!d || !b || !this.isVisible()) {
            return false
        }
        switch (this.type) {
            case"Rect":
                return (d >= this.x && d <= this.x + this.width && b >= this.y && b <= this.y + this.height);
                break;
            case"Circle":
                return ORYX.Core.Math.isPointInEllipse(d, b, this.x + this.width / 2, this.y + this.height / 2, this.radiusX, this.radiusX);
                break;
            case"Ellipse":
                return ORYX.Core.Math.isPointInEllipse(d, b, this.x + this.radiusX, this.y + this.radiusY, this.radiusX, this.radiusY);
                break;
            case"Line":
                return ORYX.Core.Math.isPointInLine(d, b, this.x, this.y, this.x + this.width, this.y + this.height);
                break;
            case"Polyline":
                var a = this.element.getAttributeNS(null, "points");
                if (a) {
                    a = a.replace(/,/g, " ").split(" ").without("");
                    a = a.collect(function (e) {
                        return parseFloat(e)
                    });
                    return ORYX.Core.Math.isPointInPolygone(d, b, a)
                } else {
                    return false
                }
                break;
            case"Path":
                if (!this.handler) {
                    var c = new PathParser();
                    this.handler = new ORYX.Core.SVG.PointsPathHandler();
                    c.setHandler(this.handler);
                    c.parsePath(this.element)
                }
                return ORYX.Core.Math.isPointInPolygone(d, b, this.handler.points);
                break;
            default:
                return false
        }
    }, isVisible: function (c) {
        if (this.visible !== undefined) {
            return this.visible
        }
        if (!c) {
            c = this.element
        }
        var b = false;
        try {
            b = !!c.ownerSVGElement
        } catch (g) {
        }
        if (b) {
            if (ORYX.Editor.checkClassType(c, SVGGElement)) {
                if (c.className && c.className.baseVal == "me") {
                    this.visible = true;
                    return this.visible
                }
            }
            var f = c.getAttributeNS(null, "fill");
            var d = c.getAttributeNS(null, "stroke");
            if (f && f == "none" && d && d == "none") {
                this.visible = false
            } else {
                var a = c.getAttributeNS(null, "display");
                if (!a) {
                    this.visible = this.isVisible(c.parentNode)
                } else {
                    if (a == "none") {
                        this.visible = false
                    } else {
                        this.visible = true
                    }
                }
            }
        } else {
            this.visible = true
        }
        return this.visible
    }, toString: function () {
        return (this.element) ? "SVGShape " + this.element.id : "SVGShape " + this.element
    }
});
if (!ORYX) {
    var ORYX = {}
}
if (!ORYX.Core) {
    ORYX.Core = {}
}
if (!ORYX.Core.SVG) {
    ORYX.Core.SVG = {}
}
ORYX.Core.SVG.Label = Clazz.extend({
    _characterSets: ["%W", "@", "m", "wDGMOQ√ñ#+=<>~^", "ABCHKNRSUVXZ√ú√Ñ&", "bdghnopqux√∂√ºETY1234567890√ü_¬ß${}*¬¥`¬µ‚Ç¨", "aeksvyz√§FLP?¬∞¬≤¬≥", "c-", 'rtJ"/()[]:;!|\\', "fjI., ", "'", "il"],
    _characterSetValues: [15, 14, 13, 11, 10, 9, 8, 7, 6, 5, 4, 3],
    construct: function (m) {
        arguments.callee.$.construct.apply(this, arguments);
        if (!m.textElement) {
            throw"Label: No parameter textElement."
        } else {
            if (!ORYX.Editor.checkClassType(m.textElement, SVGTextElement)) {
                throw"Label: Parameter textElement is not an SVGTextElement."
            }
        }
        this.invisibleRenderPoint = -5000;
        this.node = m.textElement;
        this.node.setAttributeNS(null, "stroke-width", "0pt");
        this.node.setAttributeNS(null, "letter-spacing", "-0.01px");
        this.shapeId = m.shapeId;
        this.id;
        this.fitToElemId;
        this.edgePosition;
        this.x;
        this.y;
        this.oldX;
        this.oldY;
        this.isVisible = true;
        this._text;
        this._verticalAlign;
        this._horizontalAlign;
        this._rotate;
        this._rotationPoint;
        this.anchorLeft;
        this.anchorRight;
        this.anchorTop;
        this.anchorBottom;
        this._isChanged = true;
        var k = this.node.getAttributeNS(null, "id");
        if (k) {
            this.id = k
        }
        this.fitToElemId = this.node.getAttributeNS(ORYX.CONFIG.NAMESPACE_ORYX, "fittoelem");
        if (this.fitToElemId) {
            this.fitToElemId = this.shapeId + this.fitToElemId
        }
        var f = this.node.getAttributeNS(ORYX.CONFIG.NAMESPACE_ORYX, "align");
        if (f) {
            f = f.replace(/,/g, " ");
            f = f.split(" ");
            f = f.without("");
            f.each((function (e) {
                switch (e) {
                    case"top":
                    case"middle":
                    case"bottom":
                        if (!this._verticalAlign) {
                            this._originVerticalAlign = this._verticalAlign = e
                        }
                        break;
                    case"left":
                    case"center":
                    case"right":
                        if (!this._horizontalAlign) {
                            this._originHorizontalAlign = this._horizontalAlign = e
                        }
                        break
                }
            }).bind(this))
        }
        this.edgePosition = this.node.getAttributeNS(ORYX.CONFIG.NAMESPACE_ORYX, "edgePosition");
        if (this.edgePosition) {
            this.originEdgePosition = this.edgePosition = this.edgePosition.toLowerCase()
        }
        this.offsetTop = this.node.getAttributeNS(ORYX.CONFIG.NAMESPACE_ORYX, "offsetTop") || ORYX.CONFIG.OFFSET_EDGE_LABEL_TOP;
        if (this.offsetTop) {
            this.offsetTop = parseInt(this.offsetTop)
        }
        this.offsetBottom = this.node.getAttributeNS(ORYX.CONFIG.NAMESPACE_ORYX, "offsetBottom") || ORYX.CONFIG.OFFSET_EDGE_LABEL_BOTTOM;
        if (this.offsetBottom) {
            this.offsetBottom = parseInt(this.offsetBottom)
        }
        var l = this.node.getAttributeNS(ORYX.CONFIG.NAMESPACE_ORYX, "rotate");
        if (l) {
            try {
                this._rotate = parseFloat(l)
            } catch (g) {
                this._rotate = 0
            }
        } else {
            this._rotate = 0
        }
        var b = this.node.getAttributeNS(ORYX.CONFIG.NAMESPACE_ORYX, "anchors");
        if (b) {
            b = b.replace("/,/g", " ");
            var a = b.split(" ").without("");
            for (var d = 0; d < a.length; d++) {
                switch (a[d].toLowerCase()) {
                    case"left":
                        this.originAnchorLeft = this.anchorLeft = true;
                        break;
                    case"right":
                        this.originAnchorRight = this.anchorRight = true;
                        break;
                    case"top":
                        this.originAnchorTop = this.anchorTop = true;
                        break;
                    case"bottom":
                        this.originAnchorBottom = this.anchorBottom = true;
                        break
                }
            }
        }
        if (!this._verticalAlign) {
            this._verticalAlign = "bottom"
        }
        if (!this._horizontalAlign) {
            this._horizontalAlign = "left"
        }
        var c = this.node.getAttributeNS(null, "x");
        if (c) {
            this.oldX = this.x = parseFloat(c)
        } else {
        }
        var h = this.node.getAttributeNS(null, "y");
        if (h) {
            this.oldY = this.y = parseFloat(h)
        } else {
        }
        this.text(this.node.textContent)
    },
    resetAnchorPosition: function () {
        this.anchorLeft = this.originAnchorLeft || false;
        this.anchorRight = this.originAnchorRight || false;
        this.anchorTop = this.originAnchorTop || false;
        this.anchorBottom = this.originAnchorBottom || false
    },
    isOriginAnchorLeft: function () {
        return this.originAnchorLeft || false
    },
    isOriginAnchorRight: function () {
        return this.originAnchorRight || false
    },
    isOriginAnchorTop: function () {
        return this.originAnchorTop || false
    },
    isOriginAnchorBottom: function () {
        return this.originAnchorBottom || false
    },
    isAnchorLeft: function () {
        return this.anchorLeft || false
    },
    isAnchorRight: function () {
        return this.anchorRight || false
    },
    isAnchorTop: function () {
        return this.anchorTop || false
    },
    isAnchorBottom: function () {
        return this.anchorBottom || false
    },
    getX: function () {
        try {
            var a = this.node.x.baseVal.getItem(0).value;
            switch (this.horizontalAlign()) {
                case"left":
                    return a;
                case"center":
                    return a - (this.getWidth() / 2);
                case"right":
                    return a - this.getWidth()
            }
            return this.node.getBBox().x
        } catch (b) {
            return this.x
        }
    },
    setX: function (a) {
        if (this.position) {
            this.position.x = a
        } else {
            this.setOriginX(a)
        }
    },
    getY: function () {
        try {
            return this.node.getBBox().y
        } catch (a) {
            return this.y
        }
    },
    setY: function (a) {
        if (this.position) {
            this.position.y = a
        } else {
            this.setOriginY(a)
        }
    },
    setOriginX: function (a) {
        this.x = a
    },
    setOriginY: function (a) {
        this.y = a
    },
    getWidth: function () {
        try {
            try {
                var f, h = this.node.childNodes;
                if (h.length == 0) {
                    f = this.node.getBBox().width
                } else {
                    for (var d = 0, c = h.length; d < c; ++d) {
                        var b = h[d].getComputedTextLength();
                        if ("undefined" == typeof f || f < b) {
                            f = b
                        }
                    }
                }
                return f + (f % 2 == 0 ? 0 : 1)
            } catch (a) {
                return this.node.getBBox().width
            }
        } catch (g) {
            return 0
        }
    },
    getOriginUpperLeft: function () {
        var a = this.x, b = this.y;
        switch (this._horizontalAlign) {
            case"center":
                a -= this.getWidth() / 2;
                break;
            case"right":
                a -= this.getWidth();
                break
        }
        switch (this._verticalAlign) {
            case"middle":
                b -= this.getHeight() / 2;
                break;
            case"bottom":
                b -= this.getHeight();
                break
        }
        return {x: a, y: b}
    },
    getHeight: function () {
        try {
            return this.node.getBBox().height
        } catch (a) {
            return 0
        }
    },
    getCenter: function () {
        var a = {x: this.getX(), y: this.getY()};
        a.x += this.getWidth() / 2;
        a.y += this.getHeight() / 2;
        return a
    },
    setPosition: function (a) {
        if (!a || a.x === undefined || a.y === undefined) {
            delete this.position
        } else {
            this.position = a
        }
        if (this.position) {
            delete this._referencePoint;
            delete this.edgePosition
        }
        this._isChanged = true;
        this.update()
    },
    getPosition: function () {
        return this.position
    },
    setReferencePoint: function (a) {
        if (a) {
            this._referencePoint = a
        } else {
            delete this._referencePoint
        }
        if (this._referencePoint) {
            delete this.position
        }
    },
    getReferencePoint: function () {
        return this._referencePoint || undefined
    },
    changed: function () {
        this._isChanged = true
    },
    registerOnChange: function (a) {
        if (!this.changeCallbacks) {
            this.changeCallbacks = []
        }
        if (a instanceof Function && !this.changeCallbacks.include(a)) {
            this.changeCallbacks.push(a)
        }
    },
    unregisterOnChange: function (a) {
        if (this.changeCallbacks && a instanceof Function && this.changeCallbacks.include(a)) {
            this.changeCallbacks = this.changeCallbacks.without(a)
        }
    },
    isUpdating: function () {
        return !!this._isUpdating
    },
    getOriginEdgePosition: function () {
        return this.originEdgePosition
    },
    getEdgePosition: function () {
        return this.edgePosition || null
    },
    setEdgePosition: function (a) {
        if (["starttop", "startmiddle", "startbottom", "midtop", "midbottom", "endtop", "endbottom"].include(a)) {
            this.edgePosition = a;
            delete this.position;
            delete this._referencePoint
        } else {
            delete this.edgePosition
        }
    },
    update: function (c) {
        var a = this.x, d = this.y;
        if (this.position) {
            a = this.position.x;
            d = this.position.y
        }
        a = Math.floor(a);
        d = Math.floor(d);
        if (this._isChanged || a !== this.oldX || d !== this.oldY || c === true) {
            if (this.isVisible) {
                this._isChanged = false;
                this._isUpdating = true;
                this.node.setAttributeNS(null, "x", a);
                this.node.setAttributeNS(null, "y", d);
                this.node.removeAttributeNS(null, "fill-opacity");
                this.oldX = a;
                this.oldY = d;
                if (!this.position && !this.getReferencePoint()) {
                    if (this._rotate !== undefined) {
                        if (this._rotationPoint) {
                            this.node.setAttributeNS(null, "transform", "rotate(" + this._rotate + " " + Math.floor(this._rotationPoint.x) + " " + Math.floor(this._rotationPoint.y) + ")")
                        } else {
                            this.node.setAttributeNS(null, "transform", "rotate(" + this._rotate + " " + Math.floor(a) + " " + Math.floor(d) + ")")
                        }
                    }
                } else {
                    this.node.removeAttributeNS(null, "transform")
                }
                var b = this._text.split("\n");
                while (b.last() == "") {
                    b.pop()
                }
                if (this.node.ownerDocument) {
                    if (this.fitToElemId || this._textHasChanged) {
                        this.node.textContent = "";
                        b.each((function (f, e) {
                            var g = this.node.ownerDocument.createElementNS(ORYX.CONFIG.NAMESPACE_SVG, "tspan");
                            g.textContent = f.trim();
                            if (this.fitToElemId) {
                                g.setAttributeNS(null, "x", this.invisibleRenderPoint);
                                g.setAttributeNS(null, "y", this.invisibleRenderPoint)
                            }
                            if (g.textContent === "") {
                                g.textContent = " "
                            }
                            this.node.appendChild(g)
                        }).bind(this));
                        delete this._textHasChanged;
                        delete this.indices
                    }
                    if (this.isVisible && this.fitToElemId) {
                        this.node.setAttributeNS(null, "visibility", "hidden")
                    }
                    if (this.fitToElemId) {
                        window.setTimeout(this._checkFittingToReferencedElem.bind(this), 0)
                    } else {
                        window.setTimeout(this._positionText.bind(this), 0)
                    }
                }
            } else {
                this.node.textContent = ""
            }
        }
    },
    _checkFittingToReferencedElem: function () {
        try {
            var b = $A(this.node.getElementsByTagNameNS(ORYX.CONFIG.NAMESPACE_SVG, "tspan"));
            var d = [];
            var l = this.node.ownerDocument.getElementById(this.fitToElemId);
            if (l) {
                var k = l.getBBox();
                var s = this.getFontSize();
                for (var f = 0; f < b.length; f++) {
                    var p = b[f];
                    var t = this._getRenderedTextLength(p, undefined, undefined, s);
                    var h = (this._rotate != 0 && this._rotate % 180 != 0 && this._rotate % 90 == 0 ? k.height : k.width);
                    if (t > h) {
                        var q = 0;
                        var n = 0;
                        var o = this.getTrimmedTextLength(p.textContent);
                        for (var g = 0; g < o; g++) {
                            var r = this._getRenderedTextLength(p, q, g - q, s);
                            if (r > h - 2) {
                                var c = this.node.ownerDocument.createElementNS(ORYX.CONFIG.NAMESPACE_SVG, "tspan");
                                if (n <= q) {
                                    n = (g == 0) ? g : g - 1;
                                    c.textContent = p.textContent.slice(q, n).trim()
                                } else {
                                    c.textContent = p.textContent.slice(q, ++n).trim()
                                }
                                c.setAttributeNS(null, "x", this.invisibleRenderPoint);
                                c.setAttributeNS(null, "y", this.invisibleRenderPoint);
                                d.push(c);
                                q = n
                            } else {
                                var a = p.textContent.charAt(g);
                                if (a == " " || a == "-" || a == "." || a == "," || a == ";" || a == ":") {
                                    n = g
                                }
                            }
                        }
                        p.textContent = p.textContent.slice(q).trim()
                    }
                    d.push(p)
                }
                while (this.node.hasChildNodes()) {
                    this.node.removeChild(this.node.childNodes[0])
                }
                while (d.length > 0) {
                    this.node.appendChild(d.shift())
                }
            }
        } catch (m) {
            ORYX.Log.fatal("Error " + m)
        }
        window.setTimeout(this._positionText.bind(this), 0)
    },
    _positionText: function () {
        try {
            var d = this.node.childNodes;
            var m = this.getFontSize(this.node);
            var b = [];
            var l = this.x, k = this.y;
            if (this.position) {
                l = this.position.x;
                k = this.position.y
            }
            l = Math.floor(l);
            k = Math.floor(k);
            var f = 0, a = [];
            var g = (this.indices || $R(0, d.length - 1).toArray());
            var c = g.length;
            g.each((function (n) {
                if ("undefined" == typeof n) {
                    return
                }
                var o = d[f++];
                if (o.textContent.trim() === "") {
                    b.push(o)
                } else {
                    var e = 0;
                    switch (this._verticalAlign) {
                        case"bottom":
                            e = -(c - n - 1) * (m);
                            break;
                        case"middle":
                            e = -(c / 2 - n - 1) * (m);
                            e -= ORYX.CONFIG.LABEL_LINE_DISTANCE / 2;
                            break;
                        case"top":
                            e = n * (m);
                            e += m;
                            break
                    }
                    o.setAttributeNS(null, "dy", Math.floor(e));
                    o.setAttributeNS(null, "x", l);
                    o.setAttributeNS(null, "y", k);
                    a.push(n)
                }
            }).bind(this));
            a.length = d.length;
            this.indices = this.indices || a;
            b.each(function (e) {
                this.node.removeChild(e)
            }.bind(this));
            switch (this._horizontalAlign) {
                case"left":
                    this.node.setAttributeNS(null, "text-anchor", "start");
                    break;
                case"center":
                    this.node.setAttributeNS(null, "text-anchor", "middle");
                    break;
                case"right":
                    this.node.setAttributeNS(null, "text-anchor", "end");
                    break
            }
        } catch (h) {
            this._isChanged = true
        }
        if (this.isVisible) {
            this.node.removeAttributeNS(null, "visibility")
        }
        delete this._isUpdating;
        (this.changeCallbacks || []).each(function (e) {
            e.apply(e)
        })
    },
    _getRenderedTextLength: function (c, d, b, a) {
        if (d === undefined) {
            return c.getComputedTextLength()
        } else {
            return c.getSubStringLength(d, b)
        }
    },
    _estimateTextWidth: function (d, c) {
        var b = 0;
        for (var a = 0; a < d.length; a++) {
            b += this._estimateCharacterWidth(d.charAt(a))
        }
        return b * (c / 14)
    },
    _estimateCharacterWidth: function (b) {
        for (var a = 0; a < this._characterSets.length; a++) {
            if (this._characterSets[a].indexOf(b) >= 0) {
                return this._characterSetValues[a]
            }
        }
        return 9
    },
    getReferencedElementWidth: function () {
        var a = this.node.ownerDocument.getElementById(this.fitToElemId);
        if (a) {
            var b = a.getBBox();
            if (b) {
                return (this._rotate != 0 && this._rotate % 180 != 0 && this._rotate % 90 == 0 ? b.height : b.width)
            }
        }
        return undefined
    },
    text: function () {
        switch (arguments.length) {
            case 0:
                return this._text;
                break;
            case 1:
                var a = this._text;
                if (arguments[0]) {
                    this._text = arguments[0].toString();
                    if (this._text != null && this._text != undefined) {
                        this._text = this._text.replace(/ {2,}/g, " ")
                    }
                } else {
                    this._text = ""
                }
                if (a !== this._text) {
                    this._isChanged = true;
                    this._textHasChanged = true
                }
                break;
            default:
                break
        }
    },
    getOriginVerticalAlign: function () {
        return this._originVerticalAlign
    },
    verticalAlign: function () {
        switch (arguments.length) {
            case 0:
                return this._verticalAlign;
            case 1:
                if (["top", "middle", "bottom"].member(arguments[0])) {
                    var a = this._verticalAlign;
                    this._verticalAlign = arguments[0];
                    if (this._verticalAlign !== a) {
                        this._isChanged = true
                    }
                }
                break;
            default:
                break
        }
    },
    getOriginHorizontalAlign: function () {
        return this._originHorizontalAlign
    },
    horizontalAlign: function () {
        switch (arguments.length) {
            case 0:
                return this._horizontalAlign;
            case 1:
                if (["left", "center", "right"].member(arguments[0])) {
                    var a = this._horizontalAlign;
                    this._horizontalAlign = arguments[0];
                    if (this._horizontalAlign !== a) {
                        this._isChanged = true
                    }
                }
                break;
            default:
                break
        }
    },
    rotate: function () {
        switch (arguments.length) {
            case 0:
                return this._rotate;
            case 1:
                if (this._rotate != arguments[0]) {
                    this._rotate = arguments[0];
                    this._rotationPoint = undefined;
                    this._isChanged = true
                }
            case 2:
                if (this._rotate != arguments[0] || !this._rotationPoint || this._rotationPoint.x != arguments[1].x || this._rotationPoint.y != arguments[1].y) {
                    this._rotate = arguments[0];
                    this._rotationPoint = arguments[1];
                    this._isChanged = true
                }
        }
    },
    hide: function () {
        if (this.isVisible) {
            this.isVisible = false;
            this._isChanged = true
        }
    },
    show: function () {
        if (!this.isVisible) {
            this.isVisible = true;
            this._isChanged = true;
            this._textHasChanged = true
        }
    },
    getInheritedFontSize: function (b) {
        if (!b || !b.getAttributeNS) {
            return
        }
        var a = b.getAttributeNS(null, "font-size");
        if (a) {
            return parseFloat(a)
        } else {
            if (!ORYX.Editor.checkClassType(b, SVGSVGElement)) {
                return this.getInheritedFontSize(b.parentNode)
            }
        }
    },
    getFontSize: function (b) {
        var a = this.node.getElementsByTagNameNS(ORYX.CONFIG.NAMESPACE_SVG, "tspan");
        var c = this.getInheritedFontSize(this.node);
        if (!c) {
            if (a[0] && /Firefox[\/\s](\d+\.\d+)/.test(navigator.userAgent) && new Number(RegExp.$1) >= 3) {
                c = a[0].getExtentOfChar(0).height
            } else {
                c = ORYX.CONFIG.LABEL_DEFAULT_LINE_HEIGHT
            }
            if (c <= 0) {
                c = ORYX.CONFIG.LABEL_DEFAULT_LINE_HEIGHT
            }
        }
        if (c) {
            this.node.setAttribute("oryx:fontSize", c)
        }
        return c
    },
    getTrimmedTextLength: function (b) {
        b = b.strip().gsub("  ", " ");
        var a;
        do {
            a = b.length;
            b = b.gsub("  ", " ")
        } while (a > b.length);
        return b.length
    },
    getOffsetBottom: function () {
        return this.offsetBottom
    },
    getOffsetTop: function () {
        return this.offsetTop
    },
    deserialize: function (b, a) {
        if (b && "undefined" != typeof b.x && "undefined" != typeof b.y) {
            this.setPosition({x: b.x, y: b.y});
            if ("undefined" != typeof b.distance) {
                var d = a.dockers[b.from];
                var c = a.dockers[b.to];
                if (d && c) {
                    this.setReferencePoint({
                        dirty: true,
                        distance: b.distance,
                        intersection: {x: b.x, y: b.y},
                        orientation: b.orientation,
                        segment: {
                            from: d,
                            fromIndex: b.from,
                            fromPosition: d.bounds.center(),
                            to: c,
                            toIndex: b.to,
                            toPosition: c.bounds.center()
                        }
                    })
                }
            }
            if (b.left) {
                this.anchorLeft = true
            }
            if (b.right) {
                this.anchorRight = true
            }
            if (b.top) {
                this.anchorTop = true
            }
            if (b.bottom) {
                this.anchorBottom = true
            }
            if (b.valign) {
                this.verticalAlign(b.valign)
            }
            if (b.align) {
                this.horizontalAlign(b.align)
            }
        } else {
            if (b && "undefined" != typeof b.edge) {
                this.setEdgePosition(b.edge)
            }
        }
    },
    serialize: function () {
        if (this.getEdgePosition()) {
            if (this.getOriginEdgePosition() !== this.getEdgePosition()) {
                return {edge: this.getEdgePosition()}
            } else {
                return null
            }
        }
        if (this.position) {
            var b = {x: this.position.x, y: this.position.y};
            if (this.isAnchorLeft() && this.isAnchorLeft() !== this.isOriginAnchorLeft()) {
                b.left = true
            }
            if (this.isAnchorRight() && this.isAnchorRight() !== this.isOriginAnchorRight()) {
                b.right = true
            }
            if (this.isAnchorTop() && this.isAnchorTop() !== this.isOriginAnchorTop()) {
                b.top = true
            }
            if (this.isAnchorBottom() && this.isAnchorBottom() !== this.isOriginAnchorBottom()) {
                b.bottom = true
            }
            if (this.getOriginVerticalAlign() !== this.verticalAlign()) {
                b.valign = this.verticalAlign()
            }
            if (this.getOriginHorizontalAlign() !== this.horizontalAlign()) {
                b.align = this.horizontalAlign()
            }
            return b
        }
        if (this.getReferencePoint()) {
            var a = this.getReferencePoint();
            return {
                distance: a.distance,
                x: a.intersection.x,
                y: a.intersection.y,
                from: a.segment.fromIndex,
                to: a.segment.toIndex,
                orientation: a.orientation,
                valign: this.verticalAlign(),
                align: this.horizontalAlign()
            }
        }
        return null
    },
    toString: function () {
        return "Label " + this.id
    }
});
if (!ORYX) {
    var ORYX = {}
}
if (!ORYX.Core) {
    ORYX.Core = {}
}
if (!ORYX.Core.Math) {
    ORYX.Core.Math = {}
}
ORYX.Core.Math.midPoint = function (b, a) {
    return {x: (b.x + a.x) / 2, y: (b.y + a.y) / 2}
};
ORYX.Core.Math.isPointInLine = function (h, f, g, e, b, a, d) {
    d = d ? Math.abs(d) : 1;
    if (Math.abs(g - b) <= d && Math.abs(h - g) <= d && f - Math.max(e, a) <= d && Math.min(e, a) - f <= d) {
        return true
    }
    if (Math.abs(e - a) <= d && Math.abs(f - e) <= d && h - Math.max(g, b) <= d && Math.min(g, b) - h <= d) {
        return true
    }
    if (h > Math.max(g, b) || h < Math.min(g, b)) {
        return false
    }
    if (f > Math.max(e, a) || f < Math.min(e, a)) {
        return false
    }
    var c = (e - a) / (g - b);
    return Math.abs(f - ((c * h) + e - c * g)) < d
};
ORYX.Core.Math.isPointInEllipse = function (h, f, b, g, e, d) {
    if (b === undefined || g === undefined || e === undefined || d === undefined) {
        throw"ORYX.Core.Math.isPointInEllipse needs a ellipse with these properties: x, y, radiusX, radiusY"
    }
    var c = (h - b) / e;
    var a = (f - g) / d;
    return c * c + a * a < 1
};
ORYX.Core.Math.isPointInPolygone = function (a, n, e) {
    if (arguments.length < 3) {
        throw"ORYX.Core.Math.isPointInPolygone needs two arguments"
    }
    var g = e.length - 1;
    if (e[0] !== e[g - 1] || e[1] !== e[g]) {
        e.push(e[0]);
        e.push(e[1])
    }
    var h = 0;
    var c, m, b, l, k;
    for (var f = 0; f < e.length - 3;) {
        c = e[f];
        m = e[++f];
        b = e[++f];
        l = e[f + 1];
        k = (n - m) * (b - c) - (a - c) * (l - m);
        if ((m >= n) != (l >= n)) {
            h += l - m >= 0 ? k >= 0 : k <= 0
        }
        if (!k && Math.min(c, b) <= a && a <= Math.max(c, b) && Math.min(m, l) <= n && n <= Math.max(m, l)) {
            return true
        }
    }
    return (h % 2) ? true : false
};
ORYX.Core.Math.distancePointLinie = function (e, d, a, b) {
    var c = ORYX.Core.Math.getPointOfIntersectionPointLine(e, d, a, b);
    if (!c) {
        return null
    }
    return ORYX.Core.Math.getDistancePointToPoint(a, c)
};
ORYX.Core.Math.getDistancePointToPoint = function (b, a) {
    return Math.sqrt(Math.pow(b.x - a.x, 2) + Math.pow(b.y - a.y, 2))
};
ORYX.Core.Math.getDistanceBetweenTwoPoints = function (c, b, a) {
    return ORYX.Core.Math.getDistancePointToPoint(a, c) / ORYX.Core.Math.getDistancePointToPoint(c, b)
};
ORYX.Core.Math.pointIsLeftOfLine = function (e, d, a) {
    var c = ORYX.Core.Math.getVector(e, d);
    var b = ORYX.Core.Math.getVector(e, a);
    return ((c.x * b.y) - (b.x * c.y)) > 0
};
ORYX.Core.Math.getPointBetweenTwoPoints = function (b, a, c) {
    c = Math.max(Math.min(c || 0, 1), 0);
    if (c === 0) {
        return b
    } else {
        if (c === 1) {
            return a
        }
    }
    return {x: b.x + ((a.x - b.x) * c), y: b.y + ((a.y - b.y) * c)}
};
ORYX.Core.Math.getVector = function (b, a) {
    return {x: a.x - b.x, y: a.y - b.y}
};
ORYX.Core.Math.getIdentityVector = function (a) {
    if (arguments.length == 2) {
        a = ORYX.Core.Math.getVector(arguments[0], arguments[1])
    }
    var b = Math.sqrt((a.x * a.x) + (a.y * a.y));
    return {x: a.x / (b || 1), y: a.y / (b || 1)}
};
ORYX.Core.Math.getOrthogonalIdentityVector = function (c, b) {
    var a = arguments.length == 1 ? c : ORYX.Core.Math.getIdentityVector(c, b);
    return {x: a.y, y: -a.x}
};
ORYX.Core.Math.getPointOfIntersectionPointLine = function (f, c, a, e) {
    var d = Math.pow(c.x - f.x, 2) + Math.pow(c.y - f.y, 2);
    if (d == 0) {
        return undefined
    }
    var b = ((a.x - f.x) * (c.x - f.x) + (a.y - f.y) * (c.y - f.y)) / d;
    if (e) {
        if (!(0 <= b && b <= 1)) {
            return undefined
        }
    }
    pointOfIntersection = new Object();
    pointOfIntersection.x = f.x + b * (c.x - f.x);
    pointOfIntersection.y = f.y + b * (c.y - f.y);
    return pointOfIntersection
};
ORYX.Core.Math.getTranslatedPoint = function (b, c) {
    var a = c.a * b.x + c.c * b.y + c.e * 1;
    var d = c.b * b.x + c.d * b.y + c.f * 1;
    return {x: a, y: d}
};
ORYX.Core.Math.getInverseMatrix = function (b) {
    var c = ORYX.Core.Math.getDeterminant(b), a = b;
    return {
        a: c * ((a.d * 1) - (a.f * 0)),
        b: c * ((a.f * 0) - (a.b * 1)),
        c: c * ((a.e * 0) - (a.c * 1)),
        d: c * ((a.a * 1) - (a.e * 0)),
        e: c * ((a.c * a.f) - (a.e * a.d)),
        f: c * ((a.e * a.b) - (a.a * a.f))
    }
};
ORYX.Core.Math.getDeterminant = function (a) {
    return (a.a * a.d * 1) + (a.c * a.f * 0) + (a.e * a.b * 0) - (a.e * a.d * 0) - (a.c * a.b * 1) - (a.a * a.f * 0)
};
ORYX.Core.Math.getTranslatedBoundingBox = function (a) {
    var h = a.getCTM();
    var f = a.getBBox();
    var e = ORYX.Core.Math.getTranslatedPoint({x: f.x, y: f.y}, h);
    var g = ORYX.Core.Math.getTranslatedPoint({x: f.x, y: f.y + f.height}, h);
    var b = ORYX.Core.Math.getTranslatedPoint({x: f.x + f.width, y: f.y}, h);
    var c = ORYX.Core.Math.getTranslatedPoint({x: f.x + f.width, y: f.y + f.height}, h);
    var k = {x: Math.min(e.x, g.x, b.x, c.x), y: Math.min(e.y, g.y, b.y, c.y)};
    var d = {x: Math.max(e.x, g.x, b.x, c.x), y: Math.max(e.y, g.y, b.y, c.y)};
    return {x: k.x, y: k.y, width: d.x - k.x, height: d.y - k.y}
};
ORYX.Core.Math.getAngle = function (c, a) {
    if (c.x == a.x && c.y == a.y) {
        return 0
    }
    var b = Math.asin(Math.sqrt(Math.pow(c.y - a.y, 2)) / (Math.sqrt(Math.pow(a.x - c.x, 2) + Math.pow(c.y - a.y, 2)))) * 180 / Math.PI;
    if (a.x >= c.x && a.y <= c.y) {
        return b
    } else {
        if (a.x < c.x && a.y <= c.y) {
            return 180 - b
        } else {
            if (a.x < c.x && a.y > c.y) {
                return 180 + b
            } else {
                return 360 - b
            }
        }
    }
};
new function () {
    var b = 2, c = 8, e = 4, a = 1;

    function d(g, n, m, k, h, f) {
        var l = 0;
        if (n > f) {
            l |= c
        } else {
            if (n < k) {
                l |= e
            }
        }
        if (g > h) {
            l |= b
        } else {
            if (g < m) {
                l |= a
            }
        }
        return l
    }

    ORYX.Core.Math.isRectOverLine = function (k, n, g, m, o, l, h, f) {
        return !!ORYX.Core.Math.clipLineOnRect.apply(ORYX.Core.Math, arguments)
    };
    ORYX.Core.Math.clipLineOnRect = function (h, u, g, s, f, v, q, l) {
        var m, k, p, w = 0;
        var n = false, o = false;
        m = d(h, u, f, v, q, l);
        k = d(g, s, f, v, q, l);
        do {
            if ((m | k) == 0) {
                n = true;
                o = true
            } else {
                if ((m & k) > 0) {
                    o = true
                } else {
                    var t = 0, r = 0;
                    p = m != 0 ? m : k;
                    if ((p & c) > 0) {
                        t = h + (g - h) * (l - u) / (s - u);
                        r = l
                    } else {
                        if ((p & e) > 0) {
                            t = h + (g - h) * (v - u) / (s - u);
                            r = v
                        } else {
                            if ((p & b) > 0) {
                                r = u + (s - u) * (q - h) / (g - h);
                                t = q
                            } else {
                                if ((p & a) > 0) {
                                    r = u + (s - u) * (f - h) / (g - h);
                                    t = f
                                }
                            }
                        }
                    }
                    if (p == m) {
                        h = t;
                        u = r;
                        m = d(h, u, f, v, q, l)
                    } else {
                        g = t;
                        s = r;
                        k = d(g, s, f, v, q, l)
                    }
                }
            }
            w++
        } while (o != true && w < 5000);
        if (n) {
            return {a: {x: h, y: u}, b: {x: g, y: s}}
        }
        return null
    }
}();
if (!ORYX) {
    var ORYX = {}
}
if (!ORYX.Core) {
    ORYX.Core = {}
}
if (!ORYX.Core.StencilSet) {
    ORYX.Core.StencilSet = {}
}
ORYX.Core.StencilSet.Stencil = {
    construct: function (d, e, a, k, h, g) {
        arguments.callee.$.construct.apply(this, arguments);
        if (!d) {
            throw"Stencilset seems corrupt."
        }
        if (!e) {
            throw"Stencil does not provide namespace."
        }
        if (!a) {
            throw"Stencil does not provide SVG source."
        }
        if (!k) {
            throw"Fatal internal error loading stencilset."
        }
        this._source = a;
        this._jsonStencil = d;
        this._stencilSet = k;
        this._namespace = e;
        this._propertyPackages = h;
        if (g && !this._jsonStencil.position) {
            this._jsonStencil.position = g
        }
        this._view;
        this._properties = new Hash();
        if (!this._jsonStencil.type || !(this._jsonStencil.type === "edge" || this._jsonStencil.type === "node")) {
            throw"ORYX.Core.StencilSet.Stencil(construct): Type is not defined."
        }
        if (!this._jsonStencil.id || this._jsonStencil.id === "") {
            throw"ORYX.Core.StencilSet.Stencil(construct): Id is not defined."
        }
        if (!this._jsonStencil.title || this._jsonStencil.title === "") {
            throw"ORYX.Core.StencilSet.Stencil(construct): Title is not defined."
        }
        if (!this._jsonStencil.description) {
            this._jsonStencil.description = ""
        }
        if (!this._jsonStencil.groups) {
            this._jsonStencil.groups = []
        }
        if (!this._jsonStencil.roles) {
            this._jsonStencil.roles = []
        }
        this._jsonStencil.roles.push(this._jsonStencil.id);
        this._jsonStencil.roles.each((function (m, l) {
            this._jsonStencil.roles[l] = e + m
        }).bind(this));
        this._jsonStencil.roles = this._jsonStencil.roles.uniq();
        this._jsonStencil.id = e + this._jsonStencil.id;
        this.postProcessProperties();
        if (!this._jsonStencil.serialize) {
            this._jsonStencil.serialize = {}
        }
        if (!this._jsonStencil.deserialize) {
            this._jsonStencil.deserialize = {}
        }
        if (!this._jsonStencil.layout) {
            this._jsonStencil.layout = []
        }
        var c = a + "view/" + d.view;
        if (this._jsonStencil.view.trim().match(/</)) {
            var b = new DOMParser();
            var f = b.parseFromString(this._jsonStencil.view, "text/xml");
            if (ORYX.Editor.checkClassType(f.documentElement, SVGSVGElement)) {
                this._view = f.documentElement
            } else {
                throw"ORYX.Core.StencilSet.Stencil(_loadSVGOnSuccess): The response is not a SVG document."
            }
        } else {
            new Ajax.Request(c, {
                asynchronous: false,
                method: "get",
                onSuccess: this._loadSVGOnSuccess.bind(this),
                onFailure: this._loadSVGOnFailure.bind(this)
            })
        }
    }, postProcessProperties: function () {
        this._jsonStencil.icon = ORYX.CONFIG.SERVER_HANDLER_ROOT + "/stencilsetitem/" + this._jsonStencil.objectId + "/image";
        if (this._jsonStencil.propertyPackages && this._jsonStencil.propertyPackages instanceof Array) {
            var a = this._jsonStencil.hiddenPropertyPackages;
            this._jsonStencil.propertyPackages.each((function (c) {
                var b = this._propertyPackages[c];
                if (b) {
                    b.each((function (e) {
                        var d = new ORYX.Core.StencilSet.Property(e, this._namespace, this);
                        this._properties[d.prefix() + "-" + d.id()] = d;
                        if (a.indexOf(d.id()) > -1) {
                            d.hide()
                        }
                    }).bind(this))
                }
            }).bind(this))
        }
        if (this._jsonStencil.properties && this._jsonStencil.properties instanceof Array) {
            this._jsonStencil.properties.each((function (c) {
                var b = new ORYX.Core.StencilSet.Property(c, this._namespace, this);
                this._properties[b.prefix() + "-" + b.id()] = b
            }).bind(this))
        }
    }, equals: function (a) {
        return (this.id() === a.id())
    }, stencilSet: function () {
        return this._stencilSet
    }, type: function () {
        return this._jsonStencil.type
    }, namespace: function () {
        return this._namespace
    }, id: function () {
        return this._jsonStencil.id
    }, idWithoutNs: function () {
        return this.id().replace(this.namespace(), "")
    }, title: function () {
        return ORYX.Core.StencilSet.getTranslation(this._jsonStencil, "title")
    }, description: function () {
        return ORYX.Core.StencilSet.getTranslation(this._jsonStencil, "description")
    }, groups: function () {
        return ORYX.Core.StencilSet.getTranslation(this._jsonStencil, "groups")
    }, position: function () {
        return (isNaN(this._jsonStencil.position) ? 0 : this._jsonStencil.position)
    }, view: function () {
        return this._view.cloneNode(true) || this._view
    }, icon: function () {
        return this._jsonStencil.icon
    }, fixedAspectRatio: function () {
        return this._jsonStencil.fixedAspectRatio === true
    }, hasMultipleRepositoryEntries: function () {
        return (this.getRepositoryEntries().length > 0)
    }, getRepositoryEntries: function () {
        return (this._jsonStencil.repositoryEntries) ? $A(this._jsonStencil.repositoryEntries) : $A([])
    }, properties: function () {
        return this._properties.values()
    }, property: function (a) {
        return this._properties[a]
    }, roles: function () {
        return this._jsonStencil.roles
    }, defaultAlign: function () {
        if (!this._jsonStencil.defaultAlign) {
            return "east"
        }
        return this._jsonStencil.defaultAlign
    }, serialize: function (a, b) {
        return this._jsonStencil.serialize
    }, deserialize: function (a, b) {
        return this._jsonStencil.deserialize
    }, layout: function (a) {
        return this._jsonStencil.layout
    }, addProperty: function (c, b) {
        if (c && b) {
            var a = new ORYX.Core.StencilSet.Property(c, b, this);
            this._properties[a.prefix() + "-" + a.id()] = a
        }
    }, removeProperty: function (b) {
        if (b) {
            var a = this._properties.values().find(function (c) {
                return (b == c.id())
            });
            if (a) {
                delete this._properties[a.prefix() + "-" + a.id()]
            }
        }
    }, _loadSVGOnSuccess: function (a) {
        var b = null;
        b = a.responseXML;
        if (ORYX.Editor.checkClassType(b.documentElement, SVGSVGElement)) {
            this._view = b.documentElement
        } else {
            throw"ORYX.Core.StencilSet.Stencil(_loadSVGOnSuccess): The response is not a SVG document."
        }
    }, _loadSVGOnFailure: function (a) {
        throw"ORYX.Core.StencilSet.Stencil(_loadSVGOnFailure): Loading SVG document failed."
    }, toString: function () {
        return "Stencil " + this.title() + " (" + this.id() + ")"
    }
};
ORYX.Core.StencilSet.Stencil = Clazz.extend(ORYX.Core.StencilSet.Stencil);

function _evenMoreEvilHack(c, e) {
    if (window.ActiveXObject) {
        var b = new ActiveXObject("MSXML.DomDocument");
        b.loadXML(c);
        return b
    } else {
        if (window.XMLHttpRequest) {
            var a = new XMLHttpRequest;
            a.open("GET", "data:" + (e || "application/xml") + ";charset=utf-8," + encodeURIComponent(c), false);
            if (a.overrideMimeType) {
                a.overrideMimeType(e)
            }
            a.send(null);
            return a.responseXML
        }
    }
}

function _evilSafariHack(d) {
    var b = d;
    var a = "data:text/xml;charset=utf-8," + encodeURIComponent(b);
    var e = null;
    var c = new XMLHttpRequest();
    c.open("GET", a);
    c.onload = function () {
        e = c.responseXML
    };
    c.send(null);
    return e
}

if (!ORYX) {
    var ORYX = {}
}
if (!ORYX.Core) {
    ORYX.Core = {}
}
if (!ORYX.Core.StencilSet) {
    ORYX.Core.StencilSet = {}
}
ORYX.Core.StencilSet.Property = Clazz.extend({
    construct: function (d, b, c) {
        arguments.callee.$.construct.apply(this, arguments);
        this._jsonProp = d || ORYX.Log.error("Parameter jsonProp is not defined.");
        this._namespace = b || ORYX.Log.error("Parameter namespace is not defined.");
        this._stencil = c || ORYX.Log.error("Parameter stencil is not defined.");
        this._items = {};
        this._complexItems = {};
        this._hidden = false;
        d.id = d.id || ORYX.Log.error("ORYX.Core.StencilSet.Property(construct): Id is not defined.");
        d.id = d.id.toLowerCase();
        if (!d.type) {
            ORYX.Log.info("Type is not defined for stencil '%0', id '%1'. Falling back to 'String'.", c, d.id);
            d.type = "string"
        } else {
            d.type = d.type.toLowerCase()
        }
        d.prefix = d.prefix || "oryx";
        d.title = d.title || "";
        d.value = d.value || "";
        d.description = d.description || "";
        d.readonly = d.readonly || false;
        d.optional = d.optional !== false;
        if (this._jsonProp.refToView) {
            if (!(this._jsonProp.refToView instanceof Array)) {
                this._jsonProp.refToView = [this._jsonProp.refToView]
            }
        } else {
            this._jsonProp.refToView = []
        }
        var a = this.getMinForType(d.type);
        if (d.min === undefined || d.min === null) {
            d.min = a
        } else {
            if (d.min < a) {
                d.min = a
            }
        }
        var e = this.getMaxForType(d.type);
        if (d.max === undefined || d.max === null) {
            d.max = e
        } else {
            if (d.max > e) {
                d.min = e
            }
        }
        if (!d.fillOpacity) {
            d.fillOpacity = false
        }
        if ("number" != typeof d.lightness) {
            d.lightness = 1
        } else {
            d.lightness = Math.max(0, Math.min(1, d.lightness))
        }
        if (!d.strokeOpacity) {
            d.strokeOpacity = false
        }
        if (d.length === undefined || d.length === null) {
            d.length = Number.MAX_VALUE
        }
        if (!d.wrapLines) {
            d.wrapLines = false
        }
        if (!d.dateFormat) {
            d.dateFormat = ORYX.I18N.PropertyWindow.dateFormat || "m/d/y"
        }
        if (!d.fill) {
            d.fill = false
        }
        if (!d.stroke) {
            d.stroke = false
        }
        if (!d.inverseBoolean) {
            d.inverseBoolean = false
        }
        if (!d.directlyEditable && d.directlyEditable != false) {
            d.directlyEditable = true
        }
        if (d.visible !== false) {
            d.visible = true
        }
        if (d.isList !== true) {
            d.isList = false;
            if (!d.list || !(d.list instanceof Array)) {
                d.list = []
            }
        }
        if (!d.category) {
            if (d.popular) {
                d.category = "popular"
            } else {
                d.category = "others"
            }
        }
        if (!d.alwaysAppearInMultiselect) {
            d.alwaysAppearInMultiselect = false
        }
        if (d.type === ORYX.CONFIG.TYPE_CHOICE) {
            if (d.items && d.items instanceof Array) {
                d.items.each((function (f) {
                    this._items[f.value.toLowerCase()] = new ORYX.Core.StencilSet.PropertyItem(f, b, this)
                }).bind(this))
            } else {
                throw"ORYX.Core.StencilSet.Property(construct): No property items defined."
            }
        } else {
            if (d.type === ORYX.CONFIG.TYPE_COMPLEX || d.type == ORYX.CONFIG.TYPE_MULTIPLECOMPLEX) {
                if (d.complexItems && d.complexItems instanceof Array) {
                    d.complexItems.each((function (f) {
                        this._complexItems[f.id.toLowerCase()] = new ORYX.Core.StencilSet.ComplexPropertyItem(f, b, this)
                    }).bind(this))
                }
            }
        }
    }, getMinForType: function (a) {
        if (a.toLowerCase() == ORYX.CONFIG.TYPE_INTEGER) {
            return -Math.pow(2, 31)
        } else {
            return -Number.MAX_VALUE + 1
        }
    }, getMaxForType: function (a) {
        if (a.toLowerCase() == ORYX.CONFIG.TYPE_INTEGER) {
            return Math.pow(2, 31) - 1
        } else {
            return Number.MAX_VALUE
        }
    }, equals: function (a) {
        return (this._namespace === a.namespace() && this.id() === a.id()) ? true : false
    }, namespace: function () {
        return this._namespace
    }, stencil: function () {
        return this._stencil
    }, id: function () {
        return this._jsonProp.id
    }, prefix: function () {
        return this._jsonProp.prefix
    }, type: function () {
        return this._jsonProp.type
    }, inverseBoolean: function () {
        return this._jsonProp.inverseBoolean
    }, category: function () {
        return this._jsonProp.category
    }, setCategory: function (a) {
        this._jsonProp.category = a
    }, directlyEditable: function () {
        return this._jsonProp.directlyEditable
    }, visible: function () {
        return this._jsonProp.visible
    }, title: function () {
        return ORYX.Core.StencilSet.getTranslation(this._jsonProp, "title")
    }, value: function () {
        return this._jsonProp.value
    }, readonly: function () {
        return this._jsonProp.readonly
    }, optional: function () {
        return this._jsonProp.optional
    }, description: function () {
        return ORYX.Core.StencilSet.getTranslation(this._jsonProp, "description")
    }, refToView: function () {
        return this._jsonProp.refToView
    }, min: function () {
        return this._jsonProp.min
    }, max: function () {
        return this._jsonProp.max
    }, fillOpacity: function () {
        return this._jsonProp.fillOpacity
    }, strokeOpacity: function () {
        return this._jsonProp.strokeOpacity
    }, length: function () {
        return this._jsonProp.length ? this._jsonProp.length : Number.MAX_VALUE
    }, wrapLines: function () {
        return this._jsonProp.wrapLines
    }, dateFormat: function () {
        return this._jsonProp.dateFormat
    }, fill: function () {
        return this._jsonProp.fill
    }, lightness: function () {
        return this._jsonProp.lightness
    }, stroke: function () {
        return this._jsonProp.stroke
    }, items: function () {
        return $H(this._items).values()
    }, item: function (a) {
        if (a) {
            return this._items[a.toLowerCase()]
        } else {
            return null
        }
    }, toString: function () {
        return "Property " + this.title() + " (" + this.id() + ")"
    }, complexItems: function () {
        return $H(this._complexItems).values()
    }, complexItem: function (a) {
        if (a) {
            return this._complexItems[a.toLowerCase()]
        } else {
            return null
        }
    }, complexAttributeToView: function () {
        return this._jsonProp.complexAttributeToView || ""
    }, isList: function () {
        return !!this._jsonProp.isList
    }, getListItems: function () {
        return this._jsonProp.list
    }, linkableType: function () {
        return this._jsonProp.linkableType || ""
    }, alwaysAppearInMultiselect: function () {
        return this._jsonProp.alwaysAppearInMultiselect
    }, popular: function () {
        return this._jsonProp.popular || false
    }, setPopular: function () {
        this._jsonProp.popular = true
    }, hide: function () {
        this._hidden = true
    }, isHidden: function () {
        return this._hidden
    }
});
if (!ORYX) {
    var ORYX = {}
}
if (!ORYX.Core) {
    ORYX.Core = {}
}
if (!ORYX.Core.StencilSet) {
    ORYX.Core.StencilSet = {}
}
ORYX.Core.StencilSet.PropertyItem = Clazz.extend({
    construct: function (a, b, c) {
        arguments.callee.$.construct.apply(this, arguments);
        if (!a) {
            throw"ORYX.Core.StencilSet.PropertyItem(construct): Parameter jsonItem is not defined."
        }
        if (!b) {
            throw"ORYX.Core.StencilSet.PropertyItem(construct): Parameter namespace is not defined."
        }
        if (!c) {
            throw"ORYX.Core.StencilSet.PropertyItem(construct): Parameter property is not defined."
        }
        this._jsonItem = a;
        this._namespace = b;
        this._property = c;
        if (!a.value) {
            throw"ORYX.Core.StencilSet.PropertyItem(construct): Value is not defined."
        }
        if (this._jsonItem.refToView) {
            if (!(this._jsonItem.refToView instanceof Array)) {
                this._jsonItem.refToView = [this._jsonItem.refToView]
            }
        } else {
            this._jsonItem.refToView = []
        }
    }, equals: function (a) {
        return (this.property().equals(a.property()) && this.value() === a.value())
    }, namespace: function () {
        return this._namespace
    }, property: function () {
        return this._property
    }, value: function () {
        return this._jsonItem.value
    }, title: function () {
        return ORYX.Core.StencilSet.getTranslation(this._jsonItem, "title")
    }, refToView: function () {
        return this._jsonItem.refToView
    }, icon: function () {
        return (this._jsonItem.icon) ? this.property().stencil()._source + "icons/" + this._jsonItem.icon : ""
    }, toString: function () {
        return "PropertyItem " + this.property() + " (" + this.value() + ")"
    }
});
if (!ORYX) {
    var ORYX = {}
}
if (!ORYX.Core) {
    ORYX.Core = {}
}
if (!ORYX.Core.StencilSet) {
    ORYX.Core.StencilSet = {}
}
ORYX.Core.StencilSet.ComplexPropertyItem = Clazz.extend({
    construct: function (a, b, c) {
        arguments.callee.$.construct.apply(this, arguments);
        if (!a) {
            throw"ORYX.Core.StencilSet.ComplexPropertyItem(construct): Parameter jsonItem is not defined."
        }
        if (!b) {
            throw"ORYX.Core.StencilSet.ComplexPropertyItem(construct): Parameter namespace is not defined."
        }
        if (!c) {
            throw"ORYX.Core.StencilSet.ComplexPropertyItem(construct): Parameter property is not defined."
        }
        this._jsonItem = a;
        this._namespace = b;
        this._property = c;
        this._items = new Hash();
        this._complexItems = new Hash();
        if (!a.name) {
            throw"ORYX.Core.StencilSet.ComplexPropertyItem(construct): Name is not defined."
        }
        if (!a.type) {
            throw"ORYX.Core.StencilSet.ComplexPropertyItem(construct): Type is not defined."
        } else {
            a.type = a.type.toLowerCase()
        }
        if (a.type === ORYX.CONFIG.TYPE_CHOICE) {
            if (a.items && a.items instanceof Array) {
                a.items.each((function (d) {
                    this._items[d.value] = new ORYX.Core.StencilSet.PropertyItem(d, b, this)
                }).bind(this))
            } else {
                throw"ORYX.Core.StencilSet.Property(construct): No property items defined."
            }
        } else {
            if (a.type === ORYX.CONFIG.TYPE_COMPLEX) {
                if (a.complexItems && a.complexItems instanceof Array) {
                    a.complexItems.each((function (d) {
                        this._complexItems[d.id] = new ORYX.Core.StencilSet.ComplexPropertyItem(d, b, this)
                    }).bind(this))
                } else {
                    throw"ORYX.Core.StencilSet.Property(construct): No property items defined."
                }
            }
        }
    }, equals: function (a) {
        return (this.property().equals(a.property()) && this.name() === a.name())
    }, namespace: function () {
        return this._namespace
    }, property: function () {
        return this._property
    }, name: function () {
        return ORYX.Core.StencilSet.getTranslation(this._jsonItem, "name")
    }, id: function () {
        return this._jsonItem.id
    }, type: function () {
        return this._jsonItem.type
    }, optional: function () {
        return this._jsonItem.optional
    }, width: function () {
        return this._jsonItem.width
    }, value: function () {
        return this._jsonItem.value
    }, items: function () {
        return this._items.values()
    }, complexItems: function () {
        return this._complexItems.values()
    }, disable: function () {
        return this._jsonItem.disable
    }
});
if (!ORYX) {
    var ORYX = {}
}
if (!ORYX.Core) {
    ORYX.Core = {}
}
if (!ORYX.Core.StencilSet) {
    ORYX.Core.StencilSet = {}
}
ORYX.Core.StencilSet.Rules = {
    construct: function () {
        arguments.callee.$.construct.apply(this, arguments);
        this._stencilSets = [];
        this._stencils = [];
        this._containerStencils = [];
        this._cachedConnectSET = new Hash();
        this._cachedConnectSE = new Hash();
        this._cachedConnectTE = new Hash();
        this._cachedCardSE = new Hash();
        this._cachedCardTE = new Hash();
        this._cachedContainPC = new Hash();
        this._cachedMorphRS = new Hash();
        this._connectionRules = new Hash();
        this._cardinalityRules = new Hash();
        this._containmentRules = new Hash();
        this._morphingRules = new Hash();
        this._layoutRules = new Hash()
    }, initializeRules: function (l) {
        var k = this._stencilSets.find(function (o) {
            return (o.namespace() == l.namespace())
        });
        if (k) {
            var f = this._stencilSets.clone();
            f = f.without(k);
            f.push(l);
            this._stencilSets = [];
            this._stencils = [];
            this._containerStencils = [];
            this._cachedConnectSET = new Hash();
            this._cachedConnectSE = new Hash();
            this._cachedConnectTE = new Hash();
            this._cachedCardSE = new Hash();
            this._cachedCardTE = new Hash();
            this._cachedContainPC = new Hash();
            this._cachedMorphRS = new Hash();
            this._connectionRules = new Hash();
            this._cardinalityRules = new Hash();
            this._containmentRules = new Hash();
            this._morphingRules = new Hash();
            this._layoutRules = new Hash();
            f.each(function (o) {
                this.initializeRules(o)
            }.bind(this));
            return
        } else {
            this._stencilSets.push(l);
            var m = new Hash(l.jsonRules());
            var e = l.namespace();
            var b = l.stencils();
            l.extensions().values().each(function (o) {
                if (o.rules) {
                    if (o.rules.connectionRules) {
                        m.connectionRules = m.connectionRules.concat(o.rules.connectionRules)
                    }
                    if (o.rules.cardinalityRules) {
                        m.cardinalityRules = m.cardinalityRules.concat(o.rules.cardinalityRules)
                    }
                    if (o.rules.containmentRules) {
                        m.containmentRules = m.containmentRules.concat(o.rules.containmentRules)
                    }
                    if (o.rules.morphingRules) {
                        m.morphingRules = m.morphingRules.concat(o.rules.morphingRules)
                    }
                }
                if (o.stencils) {
                    b = b.concat(o.stencils)
                }
            });
            this._stencils = this._stencils.concat(l.stencils());
            var g = this._connectionRules;
            if (m.connectionRules) {
                m.connectionRules.each((function (o) {
                    if (this._isRoleOfOtherNamespace(o.role)) {
                        if (!g[o.role]) {
                            g[o.role] = new Hash()
                        }
                    } else {
                        if (!g[e + o.role]) {
                            g[e + o.role] = new Hash()
                        }
                    }
                    o.connects.each((function (p) {
                        var s = [];
                        if (p.to) {
                            if (!(p.to instanceof Array)) {
                                p.to = [p.to]
                            }
                            p.to.each((function (t) {
                                if (this._isRoleOfOtherNamespace(t)) {
                                    s.push(t)
                                } else {
                                    s.push(e + t)
                                }
                            }).bind(this))
                        }
                        var r, q;
                        if (this._isRoleOfOtherNamespace(o.role)) {
                            r = o.role
                        } else {
                            r = e + o.role
                        }
                        if (this._isRoleOfOtherNamespace(p.from)) {
                            q = p.from
                        } else {
                            q = e + p.from
                        }
                        if (!g[r][q]) {
                            g[r][q] = s
                        } else {
                            g[r][q] = g[r][q].concat(s)
                        }
                    }).bind(this))
                }).bind(this))
            }
            var c = this._cardinalityRules;
            if (m.cardinalityRules) {
                m.cardinalityRules.each((function (q) {
                    var o;
                    if (this._isRoleOfOtherNamespace(q.role)) {
                        o = q.role
                    } else {
                        o = e + q.role
                    }
                    if (!c[o]) {
                        c[o] = {};
                        for (i in q) {
                            c[o][i] = q[i]
                        }
                    }
                    var r = new Hash();
                    if (q.outgoingEdges) {
                        q.outgoingEdges.each((function (s) {
                            if (this._isRoleOfOtherNamespace(s.role)) {
                                r[s.role] = s
                            } else {
                                r[e + s.role] = s
                            }
                        }).bind(this))
                    }
                    c[o].outgoingEdges = r;
                    var p = new Hash();
                    if (q.incomingEdges) {
                        q.incomingEdges.each((function (s) {
                            if (this._isRoleOfOtherNamespace(s.role)) {
                                p[s.role] = s
                            } else {
                                p[e + s.role] = s
                            }
                        }).bind(this))
                    }
                    c[o].incomingEdges = p
                }).bind(this))
            }
            var a = this._containmentRules;
            if (m.containmentRules) {
                m.containmentRules.each((function (p) {
                    var o;
                    if (this._isRoleOfOtherNamespace(p.role)) {
                        o = p.role
                    } else {
                        this._containerStencils.push(e + p.role);
                        o = e + p.role
                    }
                    if (!a[o]) {
                        a[o] = []
                    }
                    (p.contains || []).each((function (q) {
                        if (this._isRoleOfOtherNamespace(q)) {
                            a[o].push(q)
                        } else {
                            a[o].push(e + q)
                        }
                    }).bind(this))
                }).bind(this))
            }
            var d = this._morphingRules;
            if (m.morphingRules) {
                m.morphingRules.each((function (p) {
                    var o;
                    if (this._isRoleOfOtherNamespace(p.role)) {
                        o = p.role
                    } else {
                        o = e + p.role
                    }
                    if (!d[o]) {
                        d[o] = []
                    }
                    if (!p.preserveBounds) {
                        p.preserveBounds = false
                    }
                    p.baseMorphs.each((function (r) {
                        var q = this._getStencilById(e + r);
                        if (q) {
                            d[o].push(q)
                        }
                    }).bind(this))
                }).bind(this))
            }
            var h = this._layoutRules;
            if (m.layoutRules) {
                var n = function (p) {
                    return {edgeRole: p.edgeRole || undefined, t: p.t || 1, r: p.r || 1, b: p.b || 1, l: p.l || 1}
                };
                m.layoutRules.each(function (p) {
                    var o;
                    if (this._isRoleOfOtherNamespace(p.role)) {
                        o = p.role
                    } else {
                        o = e + p.role
                    }
                    if (!h[o]) {
                        h[o] = {}
                    }
                    if (p["in"]) {
                        h[o]["in"] = n(p["in"])
                    }
                    if (p.ins) {
                        h[o]["ins"] = (p.ins || []).map(function (q) {
                            return n(q)
                        })
                    }
                    if (p.out) {
                        h[o]["out"] = n(p.out)
                    }
                    if (p.outs) {
                        h[o]["outs"] = (p.outs || []).map(function (q) {
                            return n(q)
                        })
                    }
                }.bind(this))
            }
        }
    }, _getStencilById: function (a) {
        return this._stencils.find(function (b) {
            return b.id() == a
        })
    }, _cacheConnect: function (a) {
        result = this._canConnect(a);
        if (a.sourceStencil && a.targetStencil) {
            var c = this._cachedConnectSET[a.sourceStencil.id()];
            if (!c) {
                c = new Hash();
                this._cachedConnectSET[a.sourceStencil.id()] = c
            }
            var b = c[a.edgeStencil.id()];
            if (!b) {
                b = new Hash();
                c[a.edgeStencil.id()] = b
            }
            b[a.targetStencil.id()] = result
        } else {
            if (a.sourceStencil) {
                var c = this._cachedConnectSE[a.sourceStencil.id()];
                if (!c) {
                    c = new Hash();
                    this._cachedConnectSE[a.sourceStencil.id()] = c
                }
                c[a.edgeStencil.id()] = result
            } else {
                var d = this._cachedConnectTE[a.targetStencil.id()];
                if (!d) {
                    d = new Hash();
                    this._cachedConnectTE[a.targetStencil.id()] = d
                }
                d[a.edgeStencil.id()] = result
            }
        }
        return result
    }, _cacheCard: function (b) {
        if (b.sourceStencil) {
            var c = this._cachedCardSE[b.sourceStencil.id()];
            if (!c) {
                c = new Hash();
                this._cachedCardSE[b.sourceStencil.id()] = c
            }
            var a = this._getMaximumNumberOfOutgoingEdge(b);
            if (a == undefined) {
                a = -1
            }
            c[b.edgeStencil.id()] = a
        }
        if (b.targetStencil) {
            var d = this._cachedCardTE[b.targetStencil.id()];
            if (!d) {
                d = new Hash();
                this._cachedCardTE[b.targetStencil.id()] = d
            }
            var a = this._getMaximumNumberOfIncomingEdge(b);
            if (a == undefined) {
                a = -1
            }
            d[b.edgeStencil.id()] = a
        }
    }, _cacheContain: function (b) {
        var a = [this._canContain(b), this._getMaximumOccurrence(b.containingStencil, b.containedStencil)];
        if (a[1] == undefined) {
            a[1] = -1
        }
        var c = this._cachedContainPC[b.containingStencil.id()];
        if (!c) {
            c = new Hash();
            this._cachedContainPC[b.containingStencil.id()] = c
        }
        c[b.containedStencil.id()] = a;
        return a
    }, _cacheMorph: function (b) {
        var a = this._cachedMorphRS[b];
        if (!a) {
            a = [];
            if (this._morphingRules.keys().include(b)) {
                a = this._stencils.select(function (c) {
                    return c.roles().include(b)
                })
            }
            this._cachedMorphRS[b] = a
        }
        return a
    }, outgoingEdgeStencils: function (a) {
        if (!a.sourceShape && !a.sourceStencil) {
            return []
        }
        if (a.sourceShape) {
            a.sourceStencil = a.sourceShape.getStencil()
        }
        var b = [];
        this._stencils.each((function (d) {
            if (d.type() === "edge") {
                var c = Object.clone(a);
                c.edgeStencil = d;
                if (this.canConnect(c)) {
                    b.push(d)
                }
            }
        }).bind(this));
        return b
    }, incomingEdgeStencils: function (a) {
        if (!a.targetShape && !a.targetStencil) {
            return []
        }
        if (a.targetShape) {
            a.targetStencil = a.targetShape.getStencil()
        }
        var b = [];
        this._stencils.each((function (d) {
            if (d.type() === "edge") {
                var c = Object.clone(a);
                c.edgeStencil = d;
                if (this.canConnect(c)) {
                    b.push(d)
                }
            }
        }).bind(this));
        return b
    }, sourceStencils: function (b) {
        if (!b || !b.edgeShape && !b.edgeStencil) {
            return []
        }
        if (b.targetShape) {
            b.targetStencil = b.targetShape.getStencil()
        }
        if (b.edgeShape) {
            b.edgeStencil = b.edgeShape.getStencil()
        }
        var a = [];
        this._stencils.each((function (d) {
            var c = Object.clone(b);
            c.sourceStencil = d;
            if (this.canConnect(c)) {
                a.push(d)
            }
        }).bind(this));
        return a
    }, targetStencils: function (a) {
        if (!a || !a.edgeShape && !a.edgeStencil) {
            return []
        }
        if (a.sourceShape) {
            a.sourceStencil = a.sourceShape.getStencil()
        }
        if (a.edgeShape) {
            a.edgeStencil = a.edgeShape.getStencil()
        }
        var b = [];
        this._stencils.each((function (d) {
            var c = Object.clone(a);
            c.targetStencil = d;
            if (this.canConnect(c)) {
                b.push(d)
            }
        }).bind(this));
        return b
    }, canConnect: function (c) {
        if (!c || (!c.sourceShape && !c.sourceStencil && !c.targetShape && !c.targetStencil) || !c.edgeShape && !c.edgeStencil) {
            return false
        }
        if (c.sourceShape) {
            c.sourceStencil = c.sourceShape.getStencil()
        }
        if (c.targetShape) {
            c.targetStencil = c.targetShape.getStencil()
        }
        if (c.edgeShape) {
            c.edgeStencil = c.edgeShape.getStencil()
        }
        var b;
        if (c.sourceStencil && c.targetStencil) {
            var e = this._cachedConnectSET[c.sourceStencil.id()];
            if (!e) {
                b = this._cacheConnect(c)
            } else {
                var d = e[c.edgeStencil.id()];
                if (!d) {
                    b = this._cacheConnect(c)
                } else {
                    var f = d[c.targetStencil.id()];
                    if (f == undefined) {
                        b = this._cacheConnect(c)
                    } else {
                        b = f
                    }
                }
            }
        } else {
            if (c.sourceStencil) {
                var e = this._cachedConnectSE[c.sourceStencil.id()];
                if (!e) {
                    b = this._cacheConnect(c)
                } else {
                    var d = e[c.edgeStencil.id()];
                    if (d == undefined) {
                        b = this._cacheConnect(c)
                    } else {
                        b = d
                    }
                }
            } else {
                var f = this._cachedConnectTE[c.targetStencil.id()];
                if (!f) {
                    b = this._cacheConnect(c)
                } else {
                    var d = f[c.edgeStencil.id()];
                    if (d == undefined) {
                        b = this._cacheConnect(c)
                    } else {
                        b = d
                    }
                }
            }
        }
        if (b) {
            if (c.sourceShape) {
                var e = this._cachedCardSE[c.sourceStencil.id()];
                if (!e) {
                    this._cacheCard(c);
                    e = this._cachedCardSE[c.sourceStencil.id()]
                }
                var a = e[c.edgeStencil.id()];
                if (a == undefined) {
                    this._cacheCard(c)
                }
                a = e[c.edgeStencil.id()];
                if (a != -1) {
                    b = c.sourceShape.getOutgoingShapes().all(function (g) {
                        if ((g.getStencil().id() === c.edgeStencil.id()) && ((c.edgeShape) ? g !== c.edgeShape : true)) {
                            a--;
                            return (a > 0) ? true : false
                        } else {
                            return true
                        }
                    })
                }
            }
            if (c.targetShape) {
                var f = this._cachedCardTE[c.targetStencil.id()];
                if (!f) {
                    this._cacheCard(c);
                    f = this._cachedCardTE[c.targetStencil.id()]
                }
                var a = f[c.edgeStencil.id()];
                if (a == undefined) {
                    this._cacheCard(c)
                }
                a = f[c.edgeStencil.id()];
                if (a != -1) {
                    b = c.targetShape.getIncomingShapes().all(function (g) {
                        if ((g.getStencil().id() === c.edgeStencil.id()) && ((c.edgeShape) ? g !== c.edgeShape : true)) {
                            a--;
                            return (a > 0) ? true : false
                        } else {
                            return true
                        }
                    })
                }
            }
        }
        return b
    }, _canConnect: function (b) {
        if (!b || (!b.sourceShape && !b.sourceStencil && !b.targetShape && !b.targetStencil) || !b.edgeShape && !b.edgeStencil) {
            return false
        }
        if (b.sourceShape) {
            b.sourceStencil = b.sourceShape.getStencil()
        }
        if (b.targetShape) {
            b.targetStencil = b.targetShape.getStencil()
        }
        if (b.edgeShape) {
            b.edgeStencil = b.edgeShape.getStencil()
        }
        var c;
        var a = this._getConnectionRulesOfEdgeStencil(b.edgeStencil);
        if (a.keys().length === 0) {
            c = false
        } else {
            if (b.sourceStencil) {
                c = b.sourceStencil.roles().any(function (e) {
                    var d = a[e];
                    if (!d) {
                        return false
                    }
                    if (b.targetStencil) {
                        return (d.any(function (f) {
                            return b.targetStencil.roles().member(f)
                        }))
                    } else {
                        return true
                    }
                })
            } else {
                c = a.values().any(function (d) {
                    return b.targetStencil.roles().any(function (e) {
                        return d.member(e)
                    })
                })
            }
        }
        return c
    }, isContainer: function (a) {
        return this._containerStencils.member(a.getStencil().id())
    }, canContain: function (c) {
        if (!c || !c.containingStencil && !c.containingShape || !c.containedStencil && !c.containedShape) {
            return false
        }
        if (c.containedShape) {
            c.containedStencil = c.containedShape.getStencil()
        }
        if (c.containingShape) {
            c.containingStencil = c.containingShape.getStencil()
        }
        if (c.containedStencil.type() == "edge") {
            return false
        }
        var b;
        var d = this._cachedContainPC[c.containingStencil.id()];
        if (!d) {
            b = this._cacheContain(c)
        } else {
            b = d[c.containedStencil.id()];
            if (!b) {
                b = this._cacheContain(c)
            }
        }
        if (!b[0]) {
            return false
        } else {
            if (b[1] == -1) {
                return true
            } else {
                if (c.containingShape) {
                    var a = b[1];
                    return c.containingShape.getChildShapes(false).all(function (e) {
                        if (e.getStencil().id() === c.containedStencil.id()) {
                            a--;
                            return (a > 0) ? true : false
                        } else {
                            return true
                        }
                    })
                } else {
                    return true
                }
            }
        }
    }, _canContain: function (b) {
        if (!b || !b.containingStencil && !b.containingShape || !b.containedStencil && !b.containedShape) {
            return false
        }
        if (b.containedShape) {
            b.containedStencil = b.containedShape.getStencil()
        }
        if (b.containingShape) {
            b.containingStencil = b.containingShape.getStencil()
        }
        var a;
        a = b.containingStencil.roles().any((function (d) {
            var c = this._containmentRules[d];
            if (c) {
                return c.any(function (e) {
                    return b.containedStencil.roles().member(e)
                })
            } else {
                return false
            }
        }).bind(this));
        return a
    }, morphStencils: function (b) {
        if (!b.stencil && !b.shape) {
            return []
        }
        if (b.shape) {
            b.stencil = b.shape.getStencil()
        }
        var a = [];
        b.stencil.roles().each(function (d) {
            this._cacheMorph(d).each(function (e) {
                a.push(e)
            })
        }.bind(this));
        var c = this.baseMorphs();
        a = a.uniq().sort(function (e, d) {
            return c.include(e) && !c.include(d) ? -1 : (c.include(d) && !c.include(e) ? 1 : 0)
        });
        return a
    }, baseMorphs: function () {
        var a = [];
        this._morphingRules.each(function (b) {
            b.value.each(function (c) {
                a.push(c)
            })
        });
        return a
    }, containsMorphingRules: function () {
        return this._stencilSets.any(function (a) {
            return !!a.jsonRules().morphingRules
        })
    }, connectMorph: function (e) {
        if (!e || (!e.sourceShape && !e.sourceStencil && !e.targetShape && !e.targetStencil)) {
            return false
        }
        if (e.sourceShape) {
            e.sourceStencil = e.sourceShape.getStencil()
        }
        if (e.targetShape) {
            e.targetStencil = e.targetShape.getStencil()
        }
        var a = this.incomingEdgeStencils(e);
        var d = this.outgoingEdgeStencils(e);
        var c = a.select(function (f) {
            return d.member(f)
        });
        var b = this.baseMorphs().select(function (f) {
            return c.member(f)
        });
        if (b.size() > 0) {
            return b[0]
        } else {
            if (c.size() > 0) {
                return c[0]
            }
        }
        return null
    }, showInShapeMenu: function (a) {
        return this._stencilSets.any(function (b) {
            return b.jsonRules().morphingRules.any(function (c) {
                return a.roles().include(b.namespace() + c.role) && c.showInShapeMenu !== false
            })
        })
    }, preserveBounds: function (a) {
        return this._stencilSets.any(function (b) {
            return b.jsonRules().morphingRules.any(function (c) {
                return a.roles().include(b.namespace() + c.role) && c.preserveBounds
            })
        })
    }, getLayoutingRules: function (b, d) {
        if (!b || !(b instanceof ORYX.Core.Shape)) {
            return
        }
        var c = {"in": {}, out: {}};
        var a = function (f, e) {
            if (f && f[e]) {
                ["t", "r", "b", "l"].each(function (g) {
                    c[e][g] = Math.max(f[e][g], c[e][g] || 0)
                })
            }
            if (f && f[e + "s"] instanceof Array) {
                ["t", "r", "b", "l"].each(function (k) {
                    var g = f[e + "s"].find(function (l) {
                        return !l.edgeRole
                    });
                    var h;
                    if (d instanceof ORYX.Core.Edge) {
                        h = f[e + "s"].find(function (l) {
                            return this._hasRole(d, l.edgeRole)
                        }.bind(this))
                    }
                    c[e][k] = Math.max(h ? h[k] : g[k], c[e][k] || 0)
                }.bind(this))
            }
        }.bind(this);
        b.getStencil().roles().each(function (e) {
            if (this._layoutRules[e]) {
                a(this._layoutRules[e], "in");
                a(this._layoutRules[e], "out")
            }
        }.bind(this));
        ["in", "out"].each(function (e) {
            ["t", "r", "b", "l"].each(function (f) {
                c[e][f] = c[e][f] !== undefined ? c[e][f] : 1
            })
        });
        return c
    }, _hasRole: function (b, c) {
        if (!(b instanceof ORYX.Core.Shape) || !c) {
            return
        }
        var a = b.getStencil().roles().any(function (d) {
            return d == c
        });
        return a || b.getStencil().id() == (b.getStencil().namespace() + c)
    }, _stencilsWithRole: function (a) {
        return this._stencils.findAll(function (b) {
            return (b.roles().member(a)) ? true : false
        })
    }, _edgesWithRole: function (a) {
        return this._stencils.findAll(function (b) {
            return (b.roles().member(a) && b.type() === "edge") ? true : false
        })
    }, _nodesWithRole: function (a) {
        return this._stencils.findAll(function (b) {
            return (b.roles().member(a) && b.type() === "node") ? true : false
        })
    }, _getMaximumOccurrence: function (b, c) {
        var a;
        c.roles().each((function (e) {
            var d = this._cardinalityRules[e];
            if (d && d.maximumOccurrence) {
                if (a) {
                    a = Math.min(a, d.maximumOccurrence)
                } else {
                    a = d.maximumOccurrence
                }
            }
        }).bind(this));
        return a
    }, _getMaximumNumberOfOutgoingEdge: function (b) {
        if (!b || !b.sourceStencil || !b.edgeStencil) {
            return false
        }
        var a;
        b.sourceStencil.roles().each((function (d) {
            var c = this._cardinalityRules[d];
            if (c && c.outgoingEdges) {
                b.edgeStencil.roles().each(function (e) {
                    var f = c.outgoingEdges[e];
                    if (f && f.maximum) {
                        if (a) {
                            a = Math.min(a, f.maximum)
                        } else {
                            a = f.maximum
                        }
                    }
                })
            }
        }).bind(this));
        return a
    }, _getMaximumNumberOfIncomingEdge: function (b) {
        if (!b || !b.targetStencil || !b.edgeStencil) {
            return false
        }
        var a;
        b.targetStencil.roles().each((function (d) {
            var c = this._cardinalityRules[d];
            if (c && c.incomingEdges) {
                b.edgeStencil.roles().each(function (e) {
                    var f = c.incomingEdges[e];
                    if (f && f.maximum) {
                        if (a) {
                            a = Math.min(a, f.maximum)
                        } else {
                            a = f.maximum
                        }
                    }
                })
            }
        }).bind(this));
        return a
    }, _getConnectionRulesOfEdgeStencil: function (b) {
        var a = new Hash();
        b.roles().each((function (c) {
            if (this._connectionRules[c]) {
                this._connectionRules[c].each(function (d) {
                    if (a[d.key]) {
                        a[d.key] = a[d.key].concat(d.value)
                    } else {
                        a[d.key] = d.value
                    }
                })
            }
        }).bind(this));
        return a
    }, _isRoleOfOtherNamespace: function (a) {
        return (a.indexOf("#") > 0)
    }, toString: function () {
        return "Rules"
    }
};
ORYX.Core.StencilSet.Rules = Clazz.extend(ORYX.Core.StencilSet.Rules);
if (!ORYX) {
    var ORYX = {}
}
if (!ORYX.Core) {
    ORYX.Core = {}
}
if (!ORYX.Core.StencilSet) {
    ORYX.Core.StencilSet = {}
}
ORYX.Core.StencilSet.StencilSet = Clazz.extend({
    construct: function (d, c, b) {
        arguments.callee.$.construct.apply(this, arguments);
        if (!d) {
            throw"ORYX.Core.StencilSet.StencilSet(construct): Parameter 'source' is not defined."
        }
        if (d.endsWith("/")) {
            d = d.substr(0, d.length - 1)
        }
        this._extensions = new Hash();
        this._source = d;
        this._baseUrl = d.substring(0, d.lastIndexOf("/") + 1);
        this._jsonObject = {};
        this._stencils = new Hash();
        this._availableStencils = new Hash();
        if (ORYX.CONFIG.BACKEND_SWITCH) {
            var a = "bpmn";
            this._baseUrl = "editor/stencilsets/bpmn2.0/";
            this._source = "stencilsets/bpmn2.0/bpmn2.0.json";
            new Ajax.Request(ACTIVITI.CONFIG.contextRoot + "/app/rest/stencil-sets/editor?version=" + Date.now(), {
                asynchronous: false,
                method: "get",
                onSuccess: this._init.bind(this),
                onFailure: this._cancelInit.bind(this)
            })
        } else {
            new Ajax.Request(d, {
                asynchronous: false,
                method: "get",
                onSuccess: this._init.bind(this),
                onFailure: this._cancelInit.bind(this)
            })
        }
        if (this.errornous) {
            throw"Loading stencil set " + d + " failed."
        }
    }, findRootStencilName: function () {
        var a = this._stencils.values().find(function (b) {
            return b._jsonStencil.mayBeRoot
        });
        if (!a) {
            ORYX.Log.warn("Did not find any stencil that may be root. Taking a guess.");
            a = this._stencils.values()[0]
        }
        return a.id()
    }, equals: function (a) {
        return (this.namespace() === a.namespace())
    }, stencils: function (k, l, h) {
        if (k && l) {
            var a = this._availableStencils.values();
            var e = [k];
            var d = [];
            var m = [];
            while (e.size() > 0) {
                var b = e.pop();
                d.push(b);
                var c = a.findAll(function (o) {
                    var n = {containingStencil: b, containedStencil: o};
                    return l.canContain(n)
                });
                for (var g = 0; g < c.size(); g++) {
                    if (!d.member(c[g])) {
                        e.push(c[g])
                    }
                }
                m = m.concat(c).uniq()
            }
            m = m.sortBy(function (n) {
                return a.indexOf(n)
            });
            if (h) {
                m = m.sortBy(function (n) {
                    return n.groups().first()
                })
            }
            var f = a.findAll(function (n) {
                return n.type() == "edge"
            });
            m = m.concat(f);
            return m
        } else {
            if (h) {
                return this._availableStencils.values().sortBy(function (n) {
                    return n.groups().first()
                })
            } else {
                return this._availableStencils.values()
            }
        }
    }, nodes: function () {
        return this._availableStencils.values().findAll(function (a) {
            return (a.type() === "node")
        })
    }, edges: function () {
        return this._availableStencils.values().findAll(function (a) {
            return (a.type() === "edge")
        })
    }, stencil: function (a) {
        return this._stencils[a]
    }, title: function () {
        return ORYX.Core.StencilSet.getTranslation(this._jsonObject, "title")
    }, description: function () {
        return ORYX.Core.StencilSet.getTranslation(this._jsonObject, "description")
    }, namespace: function () {
        return this._jsonObject ? this._jsonObject.namespace : null
    }, jsonRules: function () {
        return this._jsonObject ? this._jsonObject.rules : null
    }, source: function () {
        return this._source
    }, extensions: function () {
        return this._extensions
    }, addExtension: function (a) {
        new Ajax.Request(a, {
            method: "GET", asynchronous: false, onSuccess: (function (b) {
                this.addExtensionDirectly(b.responseText)
            }).bind(this), onFailure: (function (b) {
                ORYX.Log.debug("Loading stencil set extension file failed. The request returned an error." + b)
            }).bind(this), onException: (function (b) {
                ORYX.Log.debug("Loading stencil set extension file failed. The request returned an error." + b)
            }).bind(this)
        })
    }, addExtensionDirectly: function (str) {
        try {
            eval("var jsonExtension = " + str);
            if (!(jsonExtension["extends"].endsWith("#"))) {
                jsonExtension["extends"] += "#"
            }
            if (jsonExtension["extends"] == this.namespace()) {
                this._extensions[jsonExtension.namespace] = jsonExtension;
                var defaultPosition = this._stencils.keys().size();
                if (jsonExtension.stencils) {
                    $A(jsonExtension.stencils).each(function (stencil) {
                        defaultPosition++;
                        var oStencil = new ORYX.Core.StencilSet.Stencil(stencil, this.namespace(), this._baseUrl, this, undefined, defaultPosition);
                        this._stencils[oStencil.id()] = oStencil;
                        this._availableStencils[oStencil.id()] = oStencil
                    }.bind(this))
                }
                if (jsonExtension.properties) {
                    var stencils = this._stencils.values();
                    stencils.each(function (stencil) {
                        var roles = stencil.roles();
                        jsonExtension.properties.each(function (prop) {
                            prop.roles.any(function (role) {
                                role = jsonExtension["extends"] + role;
                                if (roles.member(role)) {
                                    prop.properties.each(function (property) {
                                        stencil.addProperty(property, jsonExtension.namespace)
                                    });
                                    return true
                                } else {
                                    return false
                                }
                            })
                        })
                    }.bind(this))
                }
                if (jsonExtension.removeproperties) {
                    jsonExtension.removeproperties.each(function (remprop) {
                        var stencil = this.stencil(jsonExtension["extends"] + remprop.stencil);
                        if (stencil) {
                            remprop.properties.each(function (propId) {
                                stencil.removeProperty(propId)
                            })
                        }
                    }.bind(this))
                }
                if (jsonExtension.removestencils) {
                    $A(jsonExtension.removestencils).each(function (remstencil) {
                        delete this._availableStencils[jsonExtension["extends"] + remstencil]
                    }.bind(this))
                }
            }
        } catch (e) {
            ORYX.Log.debug("StencilSet.addExtension: Something went wrong when initialising the stencil set extension. " + e)
        }
    }, removeExtension: function (a) {
        var b = this._extensions[a];
        if (b) {
            if (b.stencils) {
                $A(b.stencils).each(function (e) {
                    var d = new ORYX.Core.StencilSet.Stencil(e, this.namespace(), this._baseUrl, this);
                    delete this._stencils[d.id()];
                    delete this._availableStencils[d.id()]
                }.bind(this))
            }
            if (b.properties) {
                var c = this._stencils.values();
                c.each(function (e) {
                    var d = e.roles();
                    b.properties.each(function (f) {
                        f.roles.any(function (g) {
                            g = b["extends"] + g;
                            if (d.member(g)) {
                                f.properties.each(function (h) {
                                    e.removeProperty(h.id)
                                });
                                return true
                            } else {
                                return false
                            }
                        })
                    })
                }.bind(this))
            }
            if (b.removeproperties) {
                b.removeproperties.each(function (f) {
                    var e = this.stencil(b["extends"] + f.stencil);
                    if (e) {
                        var d = $A(this._jsonObject.stencils).find(function (g) {
                            return g.id == e.id()
                        });
                        f.properties.each(function (h) {
                            var g = $A(d.properties).find(function (k) {
                                return k.id == h
                            });
                            e.addProperty(g, this.namespace())
                        }.bind(this))
                    }
                }.bind(this))
            }
            if (b.removestencils) {
                $A(b.removestencils).each(function (d) {
                    var e = b["extends"] + d;
                    this._availableStencils[e] = this._stencils[e]
                }.bind(this))
            }
        }
        delete this._extensions[a]
    }, __handleStencilset: function (response) {
        try {
            eval("this._jsonObject =" + response.responseText)
        } catch (e) {
            throw"Stenciset corrupt: " + e
        }
        if (!this._jsonObject) {
            throw"Error evaluating stencilset. It may be corrupt."
        }
        with (this._jsonObject) {
            if (!namespace || namespace === "") {
                throw"Namespace definition missing in stencilset."
            }
            if (!(stencils instanceof Array)) {
                throw"Stencilset corrupt."
            }
            if (!namespace.endsWith("#")) {
                namespace = namespace + "#"
            }
            if (!title) {
                title = ""
            }
            if (!description) {
                description = ""
            }
        }
    }, _init: function (c) {
        this.__handleStencilset(c);
        var b = new Hash();
        if (this._jsonObject.propertyPackages) {
            $A(this._jsonObject.propertyPackages).each((function (d) {
                b[d.name] = d.properties
            }).bind(this))
        }
        var a = 0;
        $A(this._jsonObject.stencils).each((function (e) {
            a++;
            var d = new ORYX.Core.StencilSet.Stencil(e, this.namespace(), this._baseUrl, this, b, a);
            this._stencils[d.id()] = d;
            this._availableStencils[d.id()] = d
        }).bind(this))
    }, _cancelInit: function (a) {
        this.errornous = true
    }, toString: function () {
        return "StencilSet " + this.title() + " (" + this.namespace() + ")"
    }
});
if (!ORYX) {
    var ORYX = {}
}
if (!ORYX.Core) {
    ORYX.Core = {}
}
if (!ORYX.Core.StencilSet) {
    ORYX.Core.StencilSet = {}
}
ORYX.Core.StencilSet._stencilSetsByNamespace = new Hash();
ORYX.Core.StencilSet._stencilSetsByUrl = new Hash();
ORYX.Core.StencilSet._StencilSetNSByEditorInstance = new Hash();
ORYX.Core.StencilSet._rulesByEditorInstance = new Hash();
ORYX.Core.StencilSet.stencilSets = function (b) {
    var c = ORYX.Core.StencilSet._StencilSetNSByEditorInstance[b];
    var a = new Hash();
    if (c) {
        c.each(function (e) {
            var d = ORYX.Core.StencilSet.stencilSet(e);
            a[d.namespace()] = d
        })
    }
    return a
};
ORYX.Core.StencilSet.stencilSet = function (a) {
    ORYX.Log.trace("Getting stencil set %0", a);
    var b = a.split("#", 1);
    if (b.length === 1) {
        ORYX.Log.trace("Getting stencil set %0", b[0]);
        return ORYX.Core.StencilSet._stencilSetsByNamespace[b[0] + "#"]
    } else {
        return undefined
    }
};
ORYX.Core.StencilSet.stencil = function (b) {
    ORYX.Log.trace("Getting stencil for %0", b);
    var a = ORYX.Core.StencilSet.stencilSet(b);
    if (a) {
        return a.stencil(b)
    } else {
        ORYX.Log.trace("Cannot fild stencil for %0", b);
        return undefined
    }
};
ORYX.Core.StencilSet.rules = function (a) {
    if (!ORYX.Core.StencilSet._rulesByEditorInstance[a]) {
        ORYX.Core.StencilSet._rulesByEditorInstance[a] = new ORYX.Core.StencilSet.Rules()
    }
    return ORYX.Core.StencilSet._rulesByEditorInstance[a]
};
ORYX.Core.StencilSet.loadStencilSet = function (a, d, c) {
    stencilSet = new ORYX.Core.StencilSet.StencilSet(a, d, c);
    ORYX.Core.StencilSet._stencilSetsByNamespace[stencilSet.namespace()] = stencilSet;
    ORYX.Core.StencilSet._stencilSetsByUrl[a] = stencilSet;
    var b = stencilSet.namespace();
    if (ORYX.Core.StencilSet._StencilSetNSByEditorInstance[c]) {
        ORYX.Core.StencilSet._StencilSetNSByEditorInstance[c].push(b)
    } else {
        ORYX.Core.StencilSet._StencilSetNSByEditorInstance[c] = [b]
    }
    if (ORYX.Core.StencilSet._rulesByEditorInstance[c]) {
        ORYX.Core.StencilSet._rulesByEditorInstance[c].initializeRules(stencilSet)
    } else {
        var e = new ORYX.Core.StencilSet.Rules();
        e.initializeRules(stencilSet);
        ORYX.Core.StencilSet._rulesByEditorInstance[c] = e
    }
};
ORYX.Core.StencilSet.getTranslation = function (c, b) {
    var d = ORYX.I18N.Language.toLowerCase();
    var a = c[b + "_" + d];
    if (a) {
        return a
    }
    a = c[b + "_" + d.substr(0, 2)];
    if (a) {
        return a
    }
    return c[b]
};
if (!ORYX) {
    var ORYX = {}
}
if (!ORYX.Core) {
    ORYX.Core = {}
}
ORYX.Core.Command = Clazz.extend({
    construct: function () {
    }, execute: function () {
        throw"Command.execute() has to be implemented!"
    }, rollback: function () {
        throw"Command.rollback() has to be implemented!"
    }
});
if (!ORYX) {
    var ORYX = {}
}
if (!ORYX.Core) {
    ORYX.Core = {}
}
ORYX.Core.Bounds = {
    construct: function () {
        this._changedCallbacks = [];
        this.a = {};
        this.b = {};
        this.set.apply(this, arguments);
        this.suspendChange = false;
        this.changedWhileSuspend = false
    }, _changed: function (a) {
        if (!this.suspendChange) {
            this._changedCallbacks.each(function (b) {
                b(this, a)
            }.bind(this));
            this.changedWhileSuspend = false
        } else {
            this.changedWhileSuspend = true
        }
    }, registerCallback: function (a) {
        if (!this._changedCallbacks.member(a)) {
            this._changedCallbacks.push(a)
        }
    }, unregisterCallback: function (a) {
        this._changedCallbacks = this._changedCallbacks.without(a)
    }, set: function () {
        var e = false;
        switch (arguments.length) {
            case 1:
                if (this.a.x !== arguments[0].a.x) {
                    e = true;
                    this.a.x = arguments[0].a.x
                }
                if (this.a.y !== arguments[0].a.y) {
                    e = true;
                    this.a.y = arguments[0].a.y
                }
                if (this.b.x !== arguments[0].b.x) {
                    e = true;
                    this.b.x = arguments[0].b.x
                }
                if (this.b.y !== arguments[0].b.y) {
                    e = true;
                    this.b.y = arguments[0].b.y
                }
                break;
            case 2:
                var b = Math.min(arguments[0].x, arguments[1].x);
                var a = Math.min(arguments[0].y, arguments[1].y);
                var d = Math.max(arguments[0].x, arguments[1].x);
                var c = Math.max(arguments[0].y, arguments[1].y);
                if (this.a.x !== b) {
                    e = true;
                    this.a.x = b
                }
                if (this.a.y !== a) {
                    e = true;
                    this.a.y = a
                }
                if (this.b.x !== d) {
                    e = true;
                    this.b.x = d
                }
                if (this.b.y !== c) {
                    e = true;
                    this.b.y = c
                }
                break;
            case 4:
                var b = Math.min(arguments[0], arguments[2]);
                var a = Math.min(arguments[1], arguments[3]);
                var d = Math.max(arguments[0], arguments[2]);
                var c = Math.max(arguments[1], arguments[3]);
                if (this.a.x !== b) {
                    e = true;
                    this.a.x = b
                }
                if (this.a.y !== a) {
                    e = true;
                    this.a.y = a
                }
                if (this.b.x !== d) {
                    e = true;
                    this.b.x = d
                }
                if (this.b.y !== c) {
                    e = true;
                    this.b.y = c
                }
                break
        }
        if (e) {
            this._changed(true)
        }
    }, moveTo: function () {
        var a = this.upperLeft();
        switch (arguments.length) {
            case 1:
                this.moveBy({x: arguments[0].x - a.x, y: arguments[0].y - a.y});
                break;
            case 2:
                this.moveBy({x: arguments[0] - a.x, y: arguments[1] - a.y});
                break;
            default:
        }
    }, moveBy: function () {
        var c = false;
        switch (arguments.length) {
            case 1:
                var b = arguments[0];
                if (b.x !== 0 || b.y !== 0) {
                    c = true;
                    this.a.x += b.x;
                    this.b.x += b.x;
                    this.a.y += b.y;
                    this.b.y += b.y
                }
                break;
            case 2:
                var a = arguments[0];
                var d = arguments[1];
                if (a !== 0 || d !== 0) {
                    c = true;
                    this.a.x += a;
                    this.b.x += a;
                    this.a.y += d;
                    this.b.y += d
                }
                break;
            default:
        }
        if (c) {
            this._changed()
        }
    }, include: function (c) {
        if ((this.a.x === undefined) && (this.a.y === undefined) && (this.b.x === undefined) && (this.b.y === undefined)) {
            return c
        }
        var a = Math.min(this.a.x, c.a.x);
        var f = Math.min(this.a.y, c.a.y);
        var e = Math.max(this.b.x, c.b.x);
        var d = Math.max(this.b.y, c.b.y);
        this.set(a, f, e, d)
    }, extend: function (a) {
        if (a.x !== 0 || a.y !== 0) {
            this.b.x += a.x;
            this.b.y += a.y;
            this._changed(true)
        }
    }, widen: function (a) {
        if (a !== 0) {
            this.suspendChange = true;
            this.moveBy({x: -a, y: -a});
            this.extend({x: 2 * a, y: 2 * a});
            this.suspendChange = false;
            if (this.changedWhileSuspend) {
                this._changed(true)
            }
        }
    }, upperLeft: function () {
        var a = {};
        a.x = this.a.x;
        a.y = this.a.y;
        return a
    }, lowerRight: function () {
        var a = {};
        a.x = this.b.x;
        a.y = this.b.y;
        return a
    }, width: function () {
        return this.b.x - this.a.x
    }, height: function () {
        return this.b.y - this.a.y
    }, center: function () {
        var a = {};
        a.x = (this.a.x + this.b.x) / 2;
        a.y = (this.a.y + this.b.y) / 2;
        return a
    }, midPoint: function () {
        var a = {};
        a.x = (this.b.x - this.a.x) / 2;
        a.y = (this.b.y - this.a.y) / 2;
        return a
    }, centerMoveTo: function () {
        var a = this.center();
        switch (arguments.length) {
            case 1:
                this.moveBy(arguments[0].x - a.x, arguments[0].y - a.y);
                break;
            case 2:
                this.moveBy(arguments[0] - a.x, arguments[1] - a.y);
                break
        }
    }, isIncluded: function (a, e) {
        var f, d, e;
        switch (arguments.length) {
            case 1:
                f = arguments[0].x;
                d = arguments[0].y;
                e = 0;
                break;
            case 2:
                if (arguments[0].x && arguments[0].y) {
                    f = arguments[0].x;
                    d = arguments[0].y;
                    e = Math.abs(arguments[1])
                } else {
                    f = arguments[0];
                    d = arguments[1];
                    e = 0
                }
                break;
            case 3:
                f = arguments[0];
                d = arguments[1];
                e = Math.abs(arguments[2]);
                break;
            default:
                throw"isIncluded needs one, two or three arguments"
        }
        var c = this.upperLeft();
        var b = this.lowerRight();
        if (f >= c.x - e && f <= b.x + e && d >= c.y - e && d <= b.y + e) {
            return true
        } else {
            return false
        }
    }, clone: function () {
        return new ORYX.Core.Bounds(this)
    }, toString: function () {
        return "( " + this.a.x + " | " + this.a.y + " )/( " + this.b.x + " | " + this.b.y + " )"
    }, serializeForERDF: function () {
        return this.a.x + "," + this.a.y + "," + this.b.x + "," + this.b.y
    }
};
ORYX.Core.Bounds = Clazz.extend(ORYX.Core.Bounds);
if (!ORYX) {
    var ORYX = {}
}
if (!ORYX.Core) {
    ORYX.Core = {}
}
ORYX.Core.UIObject = {
    construct: function (a) {
        this.isChanged = true;
        this.isResized = true;
        this.isVisible = true;
        this.isSelectable = false;
        this.isResizable = false;
        this.isMovable = false;
        this.id = ORYX.Editor.provideId();
        this.parent = undefined;
        this.node = undefined;
        this.children = [];
        this.bounds = new ORYX.Core.Bounds();
        this._changedCallback = this._changed.bind(this);
        this.bounds.registerCallback(this._changedCallback);
        if (a && a.eventHandlerCallback) {
            this.eventHandlerCallback = a.eventHandlerCallback
        }
    }, _changed: function (b, a) {
        this.isChanged = true;
        if (this.bounds == b) {
            this.isResized = a || this.isResized
        }
    }, update: function () {
        if (this.isChanged) {
            this.refresh();
            this.isChanged = false;
            this.children.each(function (a) {
                a.update()
            })
        }
    }, refresh: function () {
    }, getChildren: function () {
        return this.children.clone()
    }, getParents: function () {
        var a = [];
        var b = this.parent;
        while (b) {
            a.push(b);
            b = b.parent
        }
        return a
    }, isParent: function (a) {
        var b = this;
        while (b) {
            if (b === a) {
                return true
            }
            b = b.parent
        }
        return false
    }, getId: function () {
        return this.id
    }, getChildById: function (b, a) {
        return this.children.find(function (c) {
            if (c.getId() === b) {
                return c
            } else {
                if (a) {
                    var d = c.getChildById(b, a);
                    if (d) {
                        return d
                    }
                }
            }
        })
    }, add: function (a) {
        if (!(this.children.member(a))) {
            if (a.parent) {
                a.remove(a)
            }
            this.children.push(a);
            a.parent = this;
            a.node = this.node.appendChild(a.node);
            a.bounds.registerCallback(this._changedCallback)
        } else {
            ORYX.Log.info("add: ORYX.Core.UIObject is already a child of this object.")
        }
    }, remove: function (a) {
        if (this.children.member(a)) {
            this.children = this._uiObjects.without(a);
            a.parent = undefined;
            a.node = this.node.removeChild(a.node);
            a.bounds.unregisterCallback(this._changedCallback)
        } else {
            ORYX.Log.info("remove: ORYX.Core.UIObject is not a child of this object.")
        }
    }, absoluteBounds: function () {
        if (this.parent) {
            var a = this.absoluteXY();
            return new ORYX.Core.Bounds(a.x, a.y, a.x + this.bounds.width(), a.y + this.bounds.height())
        } else {
            return this.bounds.clone()
        }
    }, absoluteXY: function () {
        if (this.parent) {
            var b = this.parent.absoluteXY();
            var a = {};
            a.x = b.x + this.bounds.upperLeft().x;
            a.y = b.y + this.bounds.upperLeft().y;
            return a
        } else {
            var a = {};
            a.x = this.bounds.upperLeft().x;
            a.y = this.bounds.upperLeft().y;
            return a
        }
    }, absoluteCenterXY: function () {
        if (this.parent) {
            var b = this.parent.absoluteXY();
            var a = {};
            a.x = b.x + this.bounds.center().x;
            a.y = b.y + this.bounds.center().y;
            return a
        } else {
            var a = {};
            a.x = this.bounds.center().x;
            a.y = this.bounds.center().y;
            return a
        }
    }, hide: function () {
        this.node.setAttributeNS(null, "display", "none");
        this.isVisible = false;
        this.children.each(function (a) {
            a.hide()
        })
    }, show: function () {
        this.node.setAttributeNS(null, "display", "inherit");
        this.isVisible = true;
        this.children.each(function (a) {
            a.show()
        })
    }, addEventHandlers: function (a) {
        a.addEventListener(ORYX.CONFIG.EVENT_MOUSEDOWN, this._delegateEvent.bind(this), false);
        a.addEventListener(ORYX.CONFIG.EVENT_MOUSEMOVE, this._delegateEvent.bind(this), false);
        a.addEventListener(ORYX.CONFIG.EVENT_MOUSEUP, this._delegateEvent.bind(this), false);
        a.addEventListener(ORYX.CONFIG.EVENT_MOUSEOVER, this._delegateEvent.bind(this), false);
        a.addEventListener(ORYX.CONFIG.EVENT_MOUSEOUT, this._delegateEvent.bind(this), false);
        a.addEventListener("click", this._delegateEvent.bind(this), false);
        a.addEventListener(ORYX.CONFIG.EVENT_DBLCLICK, this._delegateEvent.bind(this), false)
    }, _delegateEvent: function (a) {
        if (this.eventHandlerCallback) {
            this.eventHandlerCallback(a, this)
        }
    }, toString: function () {
        return "UIObject " + this.id
    }
};
ORYX.Core.UIObject = Clazz.extend(ORYX.Core.UIObject);
if (!ORYX) {
    var ORYX = {}
}
if (!ORYX.Core) {
    ORYX.Core = {}
}
ORYX.Core.AbstractShape = ORYX.Core.UIObject.extend({
    construct: function (a, c, b) {
        arguments.callee.$.construct.apply(this, arguments);
        this.resourceId = ORYX.Editor.provideId();
        this._stencil = c;
        if (this._stencil._jsonStencil.superId) {
            stencilId = this._stencil.id();
            superStencilId = stencilId.substring(0, stencilId.indexOf("#") + 1) + c._jsonStencil.superId;
            stencilSet = this._stencil.stencilSet();
            this._stencil = stencilSet.stencil(superStencilId)
        }
        this.properties = new Hash();
        this.propertiesChanged = new Hash();
        this.hiddenProperties = new Hash();
        this._stencil.properties().each((function (e) {
            var d = e.prefix() + "-" + e.id();
            this.properties[d] = e.value();
            this.propertiesChanged[d] = true
        }).bind(this));
        if (c._jsonStencil.superId) {
            c.properties().each((function (g) {
                var e = g.prefix() + "-" + g.id();
                var f = g.value();
                var d = this.properties[e];
                this.properties[e] = f;
                this.propertiesChanged[e] = true;
                this._delegateEvent({type: ORYX.CONFIG.EVENT_PROPERTY_CHANGED, name: e, value: f, oldValue: d})
            }).bind(this))
        }
    }, layout: function () {
    }, getStencil: function () {
        return this._stencil
    }, getChildShapeByResourceId: function (a) {
        a = ERDF.__stripHashes(a);
        return this.getChildShapes(true).find(function (b) {
            return b.resourceId == a
        })
    }, getChildShapes: function (b, c) {
        var a = [];
        this.children.each(function (d) {
            if (d instanceof ORYX.Core.Shape && d.isVisible) {
                if (c) {
                    c(d)
                }
                a.push(d);
                if (b) {
                    a = a.concat(d.getChildShapes(b, c))
                }
            }
        });
        return a
    }, hasChildShape: function (a) {
        return this.getChildShapes().any(function (b) {
            return (b === a) || b.hasChildShape(a)
        })
    }, getChildNodes: function (b, c) {
        var a = [];
        this.children.each(function (d) {
            if (d instanceof ORYX.Core.Node && d.isVisible) {
                if (c) {
                    c(d)
                }
                a.push(d)
            }
            if (d instanceof ORYX.Core.Shape) {
                if (b) {
                    a = a.concat(d.getChildNodes(b, c))
                }
            }
        });
        return a
    }, getChildEdges: function (b, c) {
        var a = [];
        this.children.each(function (d) {
            if (d instanceof ORYX.Core.Edge && d.isVisible) {
                if (c) {
                    c(d)
                }
                a.push(d)
            }
            if (d instanceof ORYX.Core.Shape) {
                if (b) {
                    a = a.concat(d.getChildEdges(b, c))
                }
            }
        });
        return a
    }, getAbstractShapesAtPosition: function () {
        var b, e;
        switch (arguments.length) {
            case 1:
                b = arguments[0].x;
                e = arguments[0].y;
                break;
            case 2:
                b = arguments[0];
                e = arguments[1];
                break;
            default:
                throw"getAbstractShapesAtPosition needs 1 or 2 arguments!"
        }
        if (this.isPointIncluded(b, e)) {
            var a = [];
            a.push(this);
            var d = this.getChildNodes();
            var c = this.getChildEdges();
            [d, c].each(function (f) {
                var g = new Hash();
                f.each(function (h) {
                    if (!h.isVisible) {
                        return
                    }
                    var l = h.getAbstractShapesAtPosition(b, e);
                    if (l.length > 0) {
                        var k = $A(h.node.parentNode.childNodes);
                        var m = k.indexOf(h.node);
                        g[m] = l
                    }
                });
                g.keys().sort().each(function (h) {
                    a = a.concat(g[h])
                })
            });
            return a
        } else {
            return []
        }
    }, setProperty: function (b, d, c) {
        var a = this.properties[b];
        if (a !== d || c === true) {
            this.properties[b] = d;
            this.propertiesChanged[b] = true;
            this._changed();
            if (!this._isInSetProperty) {
                this._isInSetProperty = true;
                this._delegateEvent({
                    type: ORYX.CONFIG.EVENT_PROPERTY_CHANGED,
                    elements: [this],
                    name: b,
                    value: d,
                    oldValue: a
                });
                delete this._isInSetProperty
            }
        }
    }, isPropertyChanged: function () {
        return this.propertiesChanged.any(function (a) {
            return a.value
        })
    }, setHiddenProperty: function (b, c) {
        if (c === undefined) {
            delete this.hiddenProperties[b];
            return
        }
        var a = this.hiddenProperties[b];
        if (a !== c) {
            this.hiddenProperties[b] = c
        }
    }, isPointIncluded: function (d, c, b) {
        var a = b ? b : this.absoluteBounds();
        return a.isIncluded(d, c)
    }, serialize: function () {
        var a = [];
        a.push({name: "type", prefix: "oryx", value: this.getStencil().id(), type: "literal"});
        this.hiddenProperties.each(function (b) {
            a.push({name: b.key.replace("oryx-", ""), prefix: "oryx", value: b.value, type: "literal"})
        }.bind(this));
        this.getStencil().properties().each((function (d) {
            var c = d.prefix();
            var b = d.id();
            a.push({name: b, prefix: c, value: this.properties[c + "-" + b], type: "literal"})
        }).bind(this));
        return a
    }, deserialize: function (b) {
        var a = 0;
        b = b.sort(function (d, c) {
            d = Number(this.properties.keys().member(d.prefix + "-" + d.name));
            c = Number(this.properties.keys().member(c.prefix + "-" + c.name));
            return d > c ? 1 : (d < c ? -1 : 0)
        }.bind(this));
        b.each((function (g) {
            var c = g.name;
            var f = g.prefix;
            var e = g.value;
            if (Object.prototype.toString.call(e) === "Object") {
                e = JSON.stringify(e)
            }
            switch (f + "-" + c) {
                case"raziel-parent":
                    if (!this.parent) {
                        break
                    }
                    var d = this.getCanvas().getChildShapeByResourceId(e);
                    if (d) {
                        d.add(this)
                    }
                    break;
                default:
                    var h = this.getStencil().property(f + "-" + c);
                    if (h && h.isList() && typeof e === "string") {
                        if ((e || "").strip() && !e.startsWith("[") && !e.startsWith("]")) {
                            e = '["' + e.strip() + '"]'
                        }
                        e = ((e || "").strip() || "[]").evalJSON()
                    }
                    if (this.properties.keys().member(f + "-" + c)) {
                        this.setProperty(f + "-" + c, e)
                    } else {
                        if (!(c === "bounds" || c === "parent" || c === "target" || c === "dockers" || c === "docker" || c === "outgoing" || c === "incoming")) {
                            this.setHiddenProperty(f + "-" + c, e)
                        }
                    }
            }
        }).bind(this))
    }, toString: function () {
        return "ORYX.Core.AbstractShape " + this.id
    }, toJSON: function () {
        var a = {
            resourceId: this.resourceId,
            properties: jQuery.extend({}, this.properties, this.hiddenProperties).inject({}, function (d, h) {
                var c = h[0];
                var f = h[1];
                if (this.getStencil().property(c) && this.getStencil().property(c).type() === ORYX.CONFIG.TYPE_COMPLEX && Object.prototype.toString.call(f) === "String") {
                    try {
                        f = JSON.parse(f)
                    } catch (b) {
                    }
                } else {
                    if (f instanceof Date && this.getStencil().property(c)) {
                        try {
                            f = f.format(this.getStencil().property(c).dateFormat())
                        } catch (g) {
                        }
                    }
                }
                c = c.replace(/^[\w_]+-/, "");
                d[c] = f;
                return d
            }.bind(this)),
            stencil: {id: this.getStencil().idWithoutNs()},
            childShapes: this.getChildShapes().map(function (b) {
                return b.toJSON()
            })
        };
        if (this.getOutgoingShapes) {
            a.outgoing = this.getOutgoingShapes().map(function (b) {
                return {resourceId: b.resourceId}
            })
        }
        if (this.bounds) {
            a.bounds = {lowerRight: this.bounds.lowerRight(), upperLeft: this.bounds.upperLeft()}
        }
        if (this.dockers) {
            a.dockers = this.dockers.map(function (b) {
                var c = b.getDockedShape() && b.referencePoint ? b.referencePoint : b.bounds.center();
                c.getDocker = function () {
                    return b
                };
                return c
            })
        }
        jQuery.extend(a, ORYX.Core.AbstractShape.JSONHelper);
        a.getShape = function () {
            return this
        }.bind(this);
        return a
    }
});
ORYX.Core.AbstractShape.JSONHelper = {
    eachChild: function (c, b, d) {
        if (!this.childShapes) {
            return
        }
        var a = [];
        this.childShapes.each(function (e) {
            if (!(e.eachChild instanceof Function)) {
                jQuery.extend(e, ORYX.Core.AbstractShape.JSONHelper)
            }
            var f = c(e, this);
            if (f) {
                a.push(f)
            }
            if (b) {
                e.eachChild(c, b, d)
            }
        }.bind(this));
        if (d) {
            this.childShapes = a
        }
    }, getShape: function () {
        return null
    }, getChildShapes: function (a) {
        var b = this.childShapes;
        if (a) {
            this.eachChild(function (c) {
                if (!(c.getChildShapes instanceof Function)) {
                    jQuery.extend(c, ORYX.Core.AbstractShape.JSONHelper)
                }
                b = b.concat(c.getChildShapes(a))
            }, true)
        }
        return b
    }, serialize: function () {
        return JSON.stringify(this)
    }
};
if (!ORYX) {
    var ORYX = {}
}
if (!ORYX.Core) {
    ORYX.Core = {}
}
ORYX.Core.Canvas = ORYX.Core.AbstractShape.extend({
    zoomLevel: 1, construct: function (a, c, b) {
        arguments.callee.$.construct.apply(this, arguments);
        if (!(a && a.width && a.height)) {
            ORYX.Log.fatal("Canvas is missing mandatory parameters options.width and options.height.");
            return
        }
        this.facade = b;
        this.resourceId = a.id;
        this.nodes = [];
        this.edges = [];
        this.colHighlightState = 0;
        this.colHighlightEnabled = false;
        this.rootNode = ORYX.Editor.graft("http://www.w3.org/2000/svg", a.parentNode, ["svg", {
            id: this.id,
            width: a.width,
            height: a.height
        }, ["defs", {}]]);
        this.rootNode.setAttribute("xmlns:xlink", "http://www.w3.org/1999/xlink");
        this.rootNode.setAttribute("xmlns:svg", "http://www.w3.org/2000/svg");
        this._htmlContainer = ORYX.Editor.graft("http://www.w3.org/1999/xhtml", a.parentNode, ["div", {
            id: "oryx_canvas_htmlContainer",
            style: "position:absolute; top:5px"
        }]);
        this.underlayNode = ORYX.Editor.graft("http://www.w3.org/2000/svg", this.rootNode, ["svg", {id: "underlay-container"}]);
        this.columnHightlight1 = ORYX.Editor.graft("http://www.w3.org/2000/svg", this.underlayNode, ["rect", {
            x: 0,
            width: ORYX.CONFIG.FORM_ROW_WIDTH + 35,
            height: "100%",
            style: "fill: #fff6d5",
            visibility: "hidden"
        }]);
        this.columnHightlight2 = ORYX.Editor.graft("http://www.w3.org/2000/svg", this.underlayNode, ["rect", {
            x: ORYX.CONFIG.FORM_ROW_WIDTH + 35,
            width: ORYX.CONFIG.FORM_ROW_WIDTH + 25,
            height: "100%",
            style: "fill: #fff6d5",
            visibility: "hidden"
        }]);
        this.node = ORYX.Editor.graft("http://www.w3.org/2000/svg", this.rootNode, ["g", {}, ["g", {"class": "stencils"}, ["g", {"class": "me"}], ["g", {"class": "children"}], ["g", {"class": "edge"}]], ["g", {"class": "svgcontainer"}]]);
        this.node.setAttributeNS(null, "stroke", "none");
        this.node.setAttributeNS(null, "font-family", "Verdana, sans-serif");
        this.node.setAttributeNS(null, "font-size-adjust", "none");
        this.node.setAttributeNS(null, "font-style", "normal");
        this.node.setAttributeNS(null, "font-variant", "normal");
        this.node.setAttributeNS(null, "font-weight", "normal");
        this.node.setAttributeNS(null, "line-heigth", "normal");
        this.node.setAttributeNS(null, "font-size", ORYX.CONFIG.LABEL_DEFAULT_LINE_HEIGHT);
        this.bounds.set(0, 0, a.width, a.height);
        this.addEventHandlers(this.rootNode.parentNode);
        this.rootNode.oncontextmenu = function () {
            return false
        }
    }, focus: function () {
        try {
            if (!this.focusEl) {
                this.focusEl = jQuery("body").append(jQuery('<a href="#" class="x-grid3-focus x-grid3-focus-canvas"/>'));
                this.focusEl.swallowEvent("click", true)
            }
            this.focusEl.focus.defer(1, this.focusEl);
            this.focusEl.blur.defer(3, this.focusEl)
        } catch (a) {
        }
    }, setHightlightState: function (a) {
        if (this.colHighlightEnabled && this.colHighlightState != a) {
            if (a == 0) {
                this.columnHightlight1.setAttribute("visibility", "hidden");
                this.columnHightlight2.setAttribute("visibility", "hidden")
            } else {
                if (a == 1) {
                    this.columnHightlight1.setAttribute("visibility", "visible");
                    this.columnHightlight2.setAttribute("visibility", "hidden")
                } else {
                    if (a == 2) {
                        this.columnHightlight1.setAttribute("visibility", "hidden");
                        this.columnHightlight2.setAttribute("visibility", "visible")
                    } else {
                        if (a == 3) {
                            this.columnHightlight1.setAttribute("visibility", "visible");
                            this.columnHightlight2.setAttribute("visibility", "visible")
                        }
                    }
                }
            }
            this.colHighlightState = a
        }
    }, setHightlightStateBasedOnX: function (a) {
        if (a > ORYX.CONFIG.FORM_ROW_WIDTH + 30) {
            this.setHightlightState(2)
        } else {
            this.setHightlightState(1)
        }
    }, update: function () {
        this.nodes.each(function (b) {
            this._traverseForUpdate(b)
        }.bind(this));
        var a = this.getStencil().layout();
        if (a) {
            a.each(function (b) {
                b.shape = this;
                b.forceExecution = true;
                b.target = this.rootNode;
                this._delegateEvent(b)
            }.bind(this))
        }
        this.nodes.invoke("_update");
        this.edges.invoke("_update", true)
    }, _traverseForUpdate: function (a) {
        var b = a.isChanged;
        a.getChildNodes(false, function (c) {
            if (this._traverseForUpdate(c)) {
                b = true
            }
        }.bind(this));
        if (b) {
            a.layout();
            return true
        } else {
            return false
        }
    }, layout: function () {
    }, getChildNodes: function (b, c) {
        if (!b && !c) {
            return this.nodes.clone()
        } else {
            var a = [];
            this.nodes.each(function (d) {
                if (c) {
                    c(d)
                }
                a.push(d);
                if (b && d instanceof ORYX.Core.Shape) {
                    a = a.concat(d.getChildNodes(b, c))
                }
            });
            return a
        }
    }, add: function (a, c, b) {
        if (a instanceof ORYX.Core.UIObject) {
            if (!(this.children.member(a))) {
                if (a.parent) {
                    a.parent.remove(a, true)
                }
                if (c != undefined) {
                    this.children.splice(c, 0, a)
                } else {
                    this.children.push(a)
                }
                a.parent = this;
                if (a instanceof ORYX.Core.Shape) {
                    if (a instanceof ORYX.Core.Edge) {
                        a.addMarkers(this.rootNode.getElementsByTagNameNS(NAMESPACE_SVG, "defs")[0]);
                        a.node = this.node.childNodes[0].childNodes[2].appendChild(a.node);
                        this.edges.push(a)
                    } else {
                        a.node = this.node.childNodes[0].childNodes[1].appendChild(a.node);
                        this.nodes.push(a)
                    }
                } else {
                    a.node = this.node.appendChild(a.node)
                }
                a.bounds.registerCallback(this._changedCallback);
                if (this.eventHandlerCallback && b !== true) {
                    this.eventHandlerCallback({type: ORYX.CONFIG.EVENT_SHAPEADDED, shape: a})
                }
            } else {
                ORYX.Log.warn("add: ORYX.Core.UIObject is already a child of this object.")
            }
        } else {
            ORYX.Log.fatal("add: Parameter is not of type ORYX.Core.UIObject.")
        }
    }, remove: function (a, b) {
        if (this.children.member(a)) {
            var c = a.parent;
            this.children = this.children.without(a);
            a.parent = undefined;
            if (a instanceof ORYX.Core.Shape) {
                if (a instanceof ORYX.Core.Edge) {
                    a.removeMarkers();
                    a.node = this.node.childNodes[0].childNodes[2].removeChild(a.node);
                    this.edges = this.edges.without(a)
                } else {
                    a.node = this.node.childNodes[0].childNodes[1].removeChild(a.node);
                    this.nodes = this.nodes.without(a)
                }
            } else {
                a.node = this.node.removeChild(a.node)
            }
            if (this.eventHandlerCallback && b !== true) {
                this.eventHandlerCallback({type: ORYX.CONFIG.EVENT_SHAPEREMOVED, shape: a, parent: c})
            }
            a.bounds.unregisterCallback(this._changedCallback)
        } else {
            ORYX.Log.warn("remove: ORYX.Core.UIObject is not a child of this object.")
        }
    }, removeAll: function () {
        var a = this.getChildShapes();
        for (var c = 0; c < a.length; c++) {
            var b = a[c];
            this.remove(b)
        }
    }, addShapeObjects: function (d, c) {
        if (!d) {
            return
        }
        this.initializingShapes = true;
        var b = function (f, k) {
            var l = ORYX.Core.StencilSet.stencil(this.getStencil().namespace() + f.stencil.id);
            var h = (l.type() == "node") ? ORYX.Core.Node : ORYX.Core.Edge;
            var g = new h({eventHandlerCallback: c}, l, this.facade);
            g.resourceId = f.resourceId;
            g.node.id = "svg-" + f.resourceId;
            f.parent = "#" + ((f.parent && f.parent.resourceId) || k.resourceId);
            this.add(g);
            return {json: f, object: g}
        }.bind(this);
        var e = function (f) {
            var g = [];
            if (f.childShapes && f.childShapes.constructor == String) {
                f.childShapes = JSON.parse(f.childShapes)
            }
            f.childShapes.each(function (h) {
                g.push(b(h, f));
                g = g.concat(e(h))
            });
            return g
        }.bind(this);
        var a = e({childShapes: d, resourceId: this.resourceId});
        a.each(function (f) {
            var g = [];
            for (field in f.json.properties) {
                g.push({prefix: "oryx", name: field, value: f.json.properties[field]})
            }
            f.json.outgoing.each(function (k) {
                g.push({prefix: "raziel", name: "outgoing", value: "#" + k.resourceId})
            });
            if (f.object instanceof ORYX.Core.Edge) {
                var h = f.json.target || f.json.outgoing[0];
                if (h) {
                    g.push({prefix: "raziel", name: "target", value: "#" + h.resourceId})
                }
            }
            if (f.json.bounds) {
                g.push({
                    prefix: "oryx",
                    name: "bounds",
                    value: f.json.bounds.upperLeft.x + "," + f.json.bounds.upperLeft.y + "," + f.json.bounds.lowerRight.x + "," + f.json.bounds.lowerRight.y
                })
            }
            if (f.json.dockers) {
                g.push({
                    prefix: "oryx", name: "dockers", value: f.json.dockers.inject("", function (l, k) {
                        return l + k.x + " " + k.y + " "
                    }) + " #"
                })
            }
            g.push({prefix: "raziel", name: "parent", value: f.json.parent});
            f.__properties = g
        }.bind(this));
        a.each(function (f) {
            if (f.object instanceof ORYX.Core.Node) {
                f.object.deserialize(f.__properties, f.json)
            }
        });
        a.each(function (f) {
            if (f.object instanceof ORYX.Core.Edge) {
                f.object.deserialize(f.__properties, f.json);
                f.object._oldBounds = f.object.bounds.clone();
                f.object._update()
            }
        });
        delete this.initializingShapes;
        return a.pluck("object")
    }, updateSize: function () {
        var b = 0;
        var a = 0;
        var c = 100;
        this.getChildShapes(true, function (e) {
            var d = e.bounds;
            b = Math.max(b, d.lowerRight().x + c);
            a = Math.max(a, d.lowerRight().y + c)
        });
        if (this.bounds.width() < b || this.bounds.height() < a) {
            this.setSize({width: Math.max(this.bounds.width(), b), height: Math.max(this.bounds.height(), a)})
        }
    }, getRootNode: function () {
        return this.rootNode
    }, getUnderlayNode: function () {
        return this.underlayNode
    }, getSvgContainer: function () {
        return this.node.childNodes[1]
    }, getHTMLContainer: function () {
        return this._htmlContainer
    }, getShapesWithSharedParent: function (a) {
        if (!a || a.length < 1) {
            return []
        }
        if (a.length == 1) {
            return a
        }
        return a.findAll(function (c) {
            var b = c.parent;
            while (b) {
                if (a.member(b)) {
                    return false
                }
                b = b.parent
            }
            return true
        })
    }, setSize: function (b, a) {
        if (!b || !b.width || !b.height) {
            return
        }
        if (this.rootNode.parentNode) {
            this.rootNode.parentNode.style.width = b.width + "px";
            this.rootNode.parentNode.style.height = b.height + "px"
        }
        this.rootNode.setAttributeNS(null, "width", b.width);
        this.rootNode.setAttributeNS(null, "height", b.height);
        if (!a) {
            this.bounds.set({a: {x: 0, y: 0}, b: {x: b.width / this.zoomLevel, y: b.height / this.zoomLevel}})
        }
    }, getSVGRepresentation: function (o) {
        var k = this.getRootNode().cloneNode(true);
        this._removeInvisibleElements(k);
        var d, n, b, m;
        this.getChildShapes(true).each(function (q) {
            var s = q.absoluteBounds();
            var r = s.upperLeft();
            var e = s.lowerRight();
            if (d == undefined) {
                d = r.x;
                n = r.y;
                b = e.x;
                m = e.y
            } else {
                d = Math.min(d, r.x);
                n = Math.min(n, r.y);
                b = Math.max(b, e.x);
                m = Math.max(m, e.y)
            }
        });
        var f = 50;
        var c, p, h, g;
        if (d == undefined) {
            c = 0;
            p = 0;
            h = 0;
            g = 0
        } else {
            c = b;
            p = m;
            h = -d + f / 2;
            g = -n + f / 2
        }
        k.setAttributeNS(null, "width", c + f);
        k.setAttributeNS(null, "height", p + f);
        k.childNodes[1].removeAttributeNS(null, "transform");
        try {
            var a = k.childNodes[1].childNodes[1];
            a.parentNode.removeChild(a)
        } catch (l) {
        }
        if (o) {
            $A(k.getElementsByTagNameNS(ORYX.CONFIG.NAMESPACE_SVG, "tspan")).each(function (e) {
                e.textContent = e.textContent.escapeHTML()
            });
            $A(k.getElementsByTagNameNS(ORYX.CONFIG.NAMESPACE_SVG, "text")).each(function (e) {
                if (e.childNodes.length == 0) {
                    e.textContent = e.textContent.escapeHTML()
                }
            })
        }
        $A(k.getElementsByTagNameNS(ORYX.CONFIG.NAMESPACE_SVG, "image")).each(function (q) {
            var e = q.getAttributeNS("http://www.w3.org/1999/xlink", "href");
            if (!e.match("^(http|https)://")) {
                e = window.location.protocol + "//" + window.location.host + e;
                q.setAttributeNS("http://www.w3.org/1999/xlink", "href", e)
            }
        });
        $A(k.getElementsByTagNameNS(ORYX.CONFIG.NAMESPACE_SVG, "a")).each(function (e) {
            e.setAttributeNS("http://www.w3.org/1999/xlink", "xlink:href", (e.getAttributeNS("http://www.w3.org/1999/xlink", "href") || "").escapeHTML())
        });
        return k
    }, _removeInvisibleElements: function (b) {
        var a = 0;
        while (a < b.childNodes.length) {
            var c = b.childNodes[a];
            if (c.getAttributeNS && c.getAttributeNS(null, "visibility") === "hidden") {
                b.removeChild(c)
            } else {
                this._removeInvisibleElements(c);
                a++
            }
        }
    }, _delegateEvent: function (a) {
        if (this.eventHandlerCallback && (a.target == this.rootNode || a.target == this.rootNode.parentNode)) {
            this.eventHandlerCallback(a, this)
        }
    }, toString: function () {
        return "Canvas " + this.id
    }, toJSON: function () {
        var a = arguments.callee.$.toJSON.apply(this, arguments);
        a.stencilset = {
            url: this.getStencil().stencilSet().source(),
            namespace: this.getStencil().stencilSet().namespace()
        };
        return a
    }
});
var idCounter = 0;
var ID_PREFIX = "resource";

function init() {
    ORYX.Log.debug("Querying editor instances");
    ORYX.Editor.setMissingClasses();
    if (window.onOryxResourcesLoaded) {
        window.onOryxResourcesLoaded()
    } else {
        var b = window.location.search.substring(4);
        var a = "./service/model/" + b + "/json";
        ORYX.Editor.createByUrl(a)
    }
}

if (!ORYX) {
    var ORYX = {}
}
ORYX.Editor = {
    DOMEventListeners: new Hash(), selection: [], zoomLevel: 1, construct: function (d) {
        this._eventsQueue = [];
        this.loadedPlugins = [];
        this.pluginsData = [];
        this.modelMetaData = d;
        var c = d;
        this.id = c.modelId;
        if (d.model) {
            c = d.model
        }
        if (!this.id) {
            this.id = c.id;
            if (!this.id) {
                this.id = ORYX.Editor.provideId()
            }
        }
        this.fullscreen = d.fullscreen !== false;
        this._initEventListener();
        if (ORYX.CONFIG.BACKEND_SWITCH) {
            var b = (c.stencilset.namespace || c.stencilset.url).replace("#", "%23");
            ORYX.Core.StencilSet.loadStencilSet(b, this.modelMetaData, this.id)
        } else {
            var b = c.stencilset.url;
            ORYX.Core.StencilSet.loadStencilSet(b, this.modelMetaData, this.id)
        }
        this._createCanvas(c.stencil ? c.stencil.id : null, c.properties);
        this._generateGUI();
        var f = false;
        var e = false;
        var a = function () {
            if (!f || !e) {
                return
            }
            this._finishedLoading()
        }.bind(this);
        window.setTimeout(function () {
            this.loadPlugins();
            f = true;
            a()
        }.bind(this), 100);
        window.setTimeout(function () {
            this.loadSerialized(c, true);
            this.getCanvas().update();
            e = true;
            a()
        }.bind(this), 200)
    }, _finishedLoading: function () {
        this.handleEvents({type: ORYX.CONFIG.EVENT_LOADED})
    }, _initEventListener: function () {
        document.documentElement.addEventListener(ORYX.CONFIG.EVENT_KEYDOWN, this.catchKeyDownEvents.bind(this), false);
        document.documentElement.addEventListener(ORYX.CONFIG.EVENT_KEYUP, this.catchKeyUpEvents.bind(this), false);
        this._keydownEnabled = true;
        this._keyupEnabled = true;
        this.DOMEventListeners[ORYX.CONFIG.EVENT_MOUSEDOWN] = [];
        this.DOMEventListeners[ORYX.CONFIG.EVENT_MOUSEUP] = [];
        this.DOMEventListeners[ORYX.CONFIG.EVENT_MOUSEOVER] = [];
        this.DOMEventListeners[ORYX.CONFIG.EVENT_MOUSEOUT] = [];
        this.DOMEventListeners[ORYX.CONFIG.EVENT_SELECTION_CHANGED] = [];
        this.DOMEventListeners[ORYX.CONFIG.EVENT_MOUSEMOVE] = []
    }, _generateGUI: function () {
        var a = ORYX.CONFIG.WINDOW_HEIGHT;
        var b = this.getCanvas().rootNode.parentNode;
        jQuery("#canvasSection").append(b);
        if (b.parentNode) {
            b.parentNode.setAttributeNS(null, "align", "center");
            b.setAttributeNS(null, "align", "left");
            this.getCanvas().setSize({width: ORYX.CONFIG.CANVAS_WIDTH, height: ORYX.CONFIG.CANVAS_HEIGHT})
        }
    }, getAvailablePlugins: function () {
        var a = ORYX.availablePlugins.clone();
        a.each(function (b) {
            if (this.loadedPlugins.find(function (c) {
                return c.type == this.name
            }.bind(b))) {
                b.engaged = true
            } else {
                b.engaged = false
            }
        }.bind(this));
        return a
    }, loadScript: function (b, c) {
        var a = document.createElement("script");
        a.type = "text/javascript";
        if (a.readyState) {
            a.onreadystatechange = function () {
                if (a.readyState == "loaded" || a.readyState == "complete") {
                    a.onreadystatechange = null;
                    c()
                }
            }
        } else {
            a.onload = function () {
                c()
            }
        }
        a.src = b;
        document.getElementsByTagName("head")[0].appendChild(a)
    }, activatePluginByName: function (name, callback, loadTry) {
        var match = this.getAvailablePlugins().find(function (value) {
            return value.name == name
        });
        if (match && (!match.engaged || (match.engaged === "false"))) {
            var loadedStencilSetsNamespaces = this.getStencilSets().keys();
            var facade = this._getPluginFacade();
            var newPlugin;
            var me = this;
            ORYX.Log.debug("Initializing plugin '%0'", match.name);
            if (!match.requires || !match.requires.namespaces || match.requires.namespaces.any(function (req) {
                return loadedStencilSetsNamespaces.indexOf(req) >= 0
            })) {
                if (!match.notUsesIn || !match.notUsesIn.namespaces || !match.notUsesIn.namespaces.any(function (req) {
                    return loadedStencilSetsNamespaces.indexOf(req) >= 0
                })) {
                    try {
                        var className = eval(match.name);
                        var newPlugin = new className(facade, match);
                        newPlugin.type = match.name;
                        if (newPlugin.registryChanged) {
                            newPlugin.registryChanged(me.pluginsData)
                        }
                        if (newPlugin.onSelectionChanged) {
                            me.registerOnEvent(ORYX.CONFIG.EVENT_SELECTION_CHANGED, newPlugin.onSelectionChanged.bind(newPlugin))
                        }
                        this.loadedPlugins.push(newPlugin);
                        this.loadedPlugins.each(function (loaded) {
                            if (loaded.registryChanged) {
                                loaded.registryChanged(this.pluginsData)
                            }
                        }.bind(me));
                        callback(true)
                    } catch (e) {
                        ORYX.Log.warn("Plugin %0 is not available", match.name);
                        if (!!loadTry) {
                            callback(false, "INITFAILED");
                            return
                        }
                        this.loadScript("plugins/scripts/" + match.source, this.activatePluginByName.bind(this, match.name, callback, true))
                    }
                } else {
                    callback(false, "NOTUSEINSTENCILSET");
                    ORYX.Log.info("Plugin need a stencilset which is not loaded'", match.name)
                }
            } else {
                callback(false, "REQUIRESTENCILSET");
                ORYX.Log.info("Plugin need a stencilset which is not loaded'", match.name)
            }
        } else {
            callback(false, match ? "NOTFOUND" : "YETACTIVATED")
        }
    }, loadPlugins: function () {
        var me = this;
        var newPlugins = [];
        var loadedStencilSetsNamespaces = this.getStencilSets().keys();
        var facade = this._getPluginFacade();
        if (ORYX.MashupAPI && ORYX.MashupAPI.loadablePlugins && ORYX.MashupAPI.loadablePlugins instanceof Array) {
            ORYX.availablePlugins = $A(ORYX.availablePlugins).findAll(function (value) {
                return ORYX.MashupAPI.loadablePlugins.include(value.name)
            });
            ORYX.MashupAPI.loadablePlugins.each(function (className) {
                if (!(ORYX.availablePlugins.find(function (val) {
                    return val.name == className
                }))) {
                    ORYX.availablePlugins.push({name: className})
                }
            })
        }
        ORYX.availablePlugins.each(function (value) {
            ORYX.Log.debug("Initializing plugin '%0'", value.name);
            if ((!value.requires || !value.requires.namespaces || value.requires.namespaces.any(function (req) {
                return loadedStencilSetsNamespaces.indexOf(req) >= 0
            })) && (!value.notUsesIn || !value.notUsesIn.namespaces || !value.notUsesIn.namespaces.any(function (req) {
                return loadedStencilSetsNamespaces.indexOf(req) >= 0
            })) && (value.engaged || (value.engaged === undefined))) {
                try {
                    var className = eval(value.name);
                    if (className) {
                        var plugin = new className(facade, value);
                        plugin.type = value.name;
                        newPlugins.push(plugin);
                        plugin.engaged = true
                    }
                } catch (e) {
                    ORYX.Log.warn("Plugin %0 is not available %1", value.name, e)
                }
            } else {
                ORYX.Log.info("Plugin need a stencilset which is not loaded'", value.name)
            }
        });
        newPlugins.each(function (value) {
            if (value.registryChanged) {
                value.registryChanged(me.pluginsData)
            }
            if (value.onSelectionChanged) {
                me.registerOnEvent(ORYX.CONFIG.EVENT_SELECTION_CHANGED, value.onSelectionChanged.bind(value))
            }
        });
        this.loadedPlugins = newPlugins;
        this.registerPluginsOnKeyEvents();
        this.setSelection()
    }, _createCanvas: function (c, d) {
        if (c) {
            if (c.search(/^http/) === -1) {
                c = this.getStencilSets().values()[0].namespace() + c
            }
        } else {
            c = this.getStencilSets().values()[0].findRootStencilName()
        }
        var a = ORYX.Core.StencilSet.stencil(c);
        if (!a) {
            ORYX.Log.fatal("Initialisation failed, because the stencil with the type %0 is not part of one of the loaded stencil sets.", c)
        }
        var e = ORYX.Editor.graft("http://www.w3.org/1999/xhtml", null, ["div"]);
        e.addClassName("ORYX_Editor");
        this._canvas = new ORYX.Core.Canvas({
            width: ORYX.CONFIG.CANVAS_WIDTH,
            height: ORYX.CONFIG.CANVAS_HEIGHT,
            eventHandlerCallback: this.handleEvents.bind(this),
            id: this.id,
            parentNode: e
        }, a, this._getPluginFacade());
        if (d) {
            var b = [];
            for (field in d) {
                b.push({prefix: "oryx", name: field, value: d[field]})
            }
            this._canvas.deserialize(b)
        }
    }, _getPluginFacade: function () {
        if (!(this._pluginFacade)) {
            this._pluginFacade = {
                activatePluginByName: this.activatePluginByName.bind(this),
                getAvailablePlugins: this.getAvailablePlugins.bind(this),
                offer: this.offer.bind(this),
                getStencilSets: this.getStencilSets.bind(this),
                getStencilSetExtensionDefinition: function () {
                    return Object.clone(this.ss_extensions_def || {})
                }.bind(this),
                getRules: this.getRules.bind(this),
                loadStencilSet: this.loadStencilSet.bind(this),
                createShape: this.createShape.bind(this),
                deleteShape: this.deleteShape.bind(this),
                getSelection: this.getSelection.bind(this),
                setSelection: this.setSelection.bind(this),
                updateSelection: this.updateSelection.bind(this),
                getCanvas: this.getCanvas.bind(this),
                importJSON: this.importJSON.bind(this),
                getJSON: this.getJSON.bind(this),
                getSerializedJSON: this.getSerializedJSON.bind(this),
                executeCommands: this.executeCommands.bind(this),
                isExecutingCommands: this.isExecutingCommands.bind(this),
                registerOnEvent: this.registerOnEvent.bind(this),
                unregisterOnEvent: this.unregisterOnEvent.bind(this),
                raiseEvent: this.handleEvents.bind(this),
                enableEvent: this.enableEvent.bind(this),
                disableEvent: this.disableEvent.bind(this),
                eventCoordinates: this.eventCoordinates.bind(this),
                eventCoordinatesXY: this.eventCoordinatesXY.bind(this),
                getModelMetaData: this.getModelMetaData.bind(this)
            }
        }
        return this._pluginFacade
    }, isExecutingCommands: function () {
        return !!this.commandExecuting
    }, executeCommands: function (a) {
        if (!this.commandStack) {
            this.commandStack = []
        }
        if (!this.commandStackExecuted) {
            this.commandStackExecuted = []
        }
        this.commandStack = [].concat(this.commandStack).concat(a);
        if (this.commandExecuting) {
            return
        }
        this.commandExecuting = true;
        while (this.commandStack.length > 0) {
            var b = this.commandStack.shift();
            b.execute();
            this.commandStackExecuted.push(b)
        }
        this.handleEvents({type: ORYX.CONFIG.EVENT_EXECUTE_COMMANDS, commands: this.commandStackExecuted});
        delete this.commandStack;
        delete this.commandStackExecuted;
        delete this.commandExecuting;
        this.updateSelection()
    }, getJSON: function () {
        delete Array.prototype.toJSON;
        var a = this.getCanvas().toJSON();
        a.ssextensions = this.getStencilSets().values()[0].extensions().keys().findAll(function (b) {
            return !b.endsWith("/meta#")
        });
        return a
    }, getSerializedJSON: function () {
        return JSON.stringify(this.getJSON())
    }, importJSON: function (d, c) {
        try {
            d = this.renewResourceIds(d)
        } catch (b) {
            throw b
        }
        if (d.stencilset.namespace && d.stencilset.namespace !== this.getCanvas().getStencil().stencilSet().namespace()) {
            alert(String.format(ORYX.I18N.JSONImport.wrongSS, d.stencilset.namespace, this.getCanvas().getStencil().stencilSet().namespace()));
            return null
        } else {
            var a = ORYX.Core.Command.extend({
                construct: function (g, k, f, h) {
                    this.jsonObject = g;
                    this.noSelection = f;
                    this.facade = h;
                    this.shapes;
                    this.connections = [];
                    this.parents = new Hash();
                    this.selection = this.facade.getSelection();
                    this.loadSerialized = k
                }, execute: function () {
                    if (!this.shapes) {
                        this.shapes = this.loadSerialized(this.jsonObject);
                        this.shapes.each(function (g) {
                            if (g.getDockers) {
                                var f = g.getDockers();
                                if (f) {
                                    if (f.length > 0) {
                                        this.connections.push([f.first(), f.first().getDockedShape(), f.first().referencePoint])
                                    }
                                    if (f.length > 1) {
                                        this.connections.push([f.last(), f.last().getDockedShape(), f.last().referencePoint])
                                    }
                                }
                            }
                            this.parents[g.id] = g.parent
                        }.bind(this))
                    } else {
                        this.shapes.each(function (f) {
                            this.parents[f.id].add(f)
                        }.bind(this));
                        this.connections.each(function (f) {
                            f[0].setDockedShape(f[1]);
                            f[0].setReferencePoint(f[2]);
                            f[0].update()
                        })
                    }
                    this.facade.getCanvas().update();
                    if (!this.noSelection) {
                        this.facade.setSelection(this.shapes)
                    } else {
                        this.facade.updateSelection()
                    }
                    this.facade.getCanvas().updateSize()
                }, rollback: function () {
                    var f = this.facade.getSelection();
                    this.shapes.each(function (g) {
                        f = f.without(g);
                        this.facade.deleteShape(g)
                    }.bind(this));
                    this.facade.getCanvas().update();
                    this.facade.setSelection(f)
                }
            });
            var e = new a(d, this.loadSerialized.bind(this), c, this._getPluginFacade());
            this.executeCommands([e]);
            return e.shapes.clone()
        }
    }, renewResourceIds: function (b) {
        if (Object.prototype.toString.call(b) === "String") {
            try {
                var d = b;
                b = JSON.parse(b)
            } catch (a) {
                throw new SyntaxError(a.message)
            }
        } else {
            var d = JSON.stringify(b)
        }
        var e = function (f) {
            if (!f) {
                return []
            }
            return f.map(function (g) {
                return e(g.childShapes).concat(g.resourceId)
            }).flatten()
        };
        var c = e(b.childShapes);
        c.each(function (f) {
            var g = ORYX.Editor.provideId();
            d = d.replace(new RegExp(f, "g"), g)
        });
        return JSON.parse(d)
    }, loadSerialized: function (d, e) {
        var c = this.getCanvas();
        this.loadSSExtensions(d.ssextensions);
        if (e === true) {
            var b = this.getExtensionForMetaData();
            if (b) {
                this.loadSSExtension(b)
            }
        }
        var a = this.getCanvas().addShapeObjects(d.childShapes, this.handleEvents.bind(this));
        if (d.properties) {
            for (key in d.properties) {
                var f = d.properties[key];
                var g = this.getCanvas().getStencil().property("oryx-" + key);
                if (!(typeof f === "string") && (!g || !g.isList())) {
                    f = JSON.stringify(f)
                }
                this.getCanvas().setProperty("oryx-" + key, f)
            }
        }
        this.getCanvas().updateSize();
        this.selection = [null];
        this.setSelection([]);
        return a
    }, getExtensionForMetaData: function () {
        if (!this.ss_extensions_def || !(this.ss_extensions_def.extensions instanceof Array)) {
            return null
        }
        var a = this.getStencilSets();
        var b = this.ss_extensions_def.extensions.find(function (c) {
            return !!a[c["extends"]] && c.namespace.endsWith("/meta#")
        });
        return b ? b.namespace || null : null
    }, loadSSExtensions: function (a) {
        if (!a) {
            return
        }
        a.each(function (b) {
            this.loadSSExtension(b)
        }.bind(this))
    }, loadSSExtension: function (b) {
        if (this.ss_extensions_def) {
            var c = this.ss_extensions_def.extensions.find(function (d) {
                return (d.namespace == b)
            });
            if (!c) {
                return
            }
            var a = this.getStencilSets()[c["extends"]];
            if (!a) {
                return
            }
            if ((c.definition || "").startsWith("/")) {
                a.addExtension(c.definition)
            } else {
                a.addExtension(ORYX.CONFIG.SS_EXTENSIONS_FOLDER + c.definition)
            }
            this.getRules().initializeRules(a);
            this._getPluginFacade().raiseEvent({type: ORYX.CONFIG.EVENT_STENCIL_SET_LOADED})
        }
    }, disableEvent: function (a) {
        if (a == ORYX.CONFIG.EVENT_KEYDOWN) {
            this._keydownEnabled = false
        }
        if (a == ORYX.CONFIG.EVENT_KEYUP) {
            this._keyupEnabled = false
        }
        if (this.DOMEventListeners.keys().member(a)) {
            var b = this.DOMEventListeners.remove(a);
            this.DOMEventListeners["disable_" + a] = b
        }
    }, enableEvent: function (a) {
        if (a == ORYX.CONFIG.EVENT_KEYDOWN) {
            this._keydownEnabled = true
        }
        if (a == ORYX.CONFIG.EVENT_KEYUP) {
            this._keyupEnabled = true
        }
        if (this.DOMEventListeners.keys().member("disable_" + a)) {
            var b = this.DOMEventListeners.remove("disable_" + a);
            this.DOMEventListeners[a] = b
        }
    }, registerOnEvent: function (a, b) {
        if (!(this.DOMEventListeners.keys().member(a))) {
            this.DOMEventListeners[a] = []
        }
        this.DOMEventListeners[a].push(b)
    }, unregisterOnEvent: function (a, b) {
        if (this.DOMEventListeners.keys().member(a)) {
            this.DOMEventListeners[a] = this.DOMEventListeners[a].without(b)
        } else {
        }
    }, getSelection: function () {
        return this.selection || []
    }, getStencilSets: function () {
        return ORYX.Core.StencilSet.stencilSets(this.id)
    }, getRules: function () {
        return ORYX.Core.StencilSet.rules(this.id)
    }, loadStencilSet: function (a) {
        try {
            ORYX.Core.StencilSet.loadStencilSet(a, this.modelMetaData, this.id);
            this.handleEvents({type: ORYX.CONFIG.EVENT_STENCIL_SET_LOADED})
        } catch (b) {
            ORYX.Log.warn("Requesting stencil set file failed. (" + b + ")")
        }
    }, offer: function (a) {
        if (!this.pluginsData.member(a)) {
            this.pluginsData.push(a)
        }
    }, registerPluginsOnKeyEvents: function () {
        this.pluginsData.each(function (a) {
            if (a.keyCodes) {
                a.keyCodes.each(function (c) {
                    var b = "key.event";
                    b += "." + c.keyAction;
                    if (c.metaKeys) {
                        if (c.metaKeys.indexOf(ORYX.CONFIG.META_KEY_META_CTRL) > -1) {
                            b += "." + ORYX.CONFIG.META_KEY_META_CTRL
                        }
                        if (c.metaKeys.indexOf(ORYX.CONFIG.META_KEY_ALT) > -1) {
                            b += "." + ORYX.CONFIG.META_KEY_ALT
                        }
                        if (c.metaKeys.indexOf(ORYX.CONFIG.META_KEY_SHIFT) > -1) {
                            b += "." + ORYX.CONFIG.META_KEY_SHIFT
                        }
                    }
                    if (c.keyCode) {
                        b += "." + c.keyCode
                    }
                    ORYX.Log.debug("Register Plugin on Key Event: %0", b);
                    if (a.toggle === true && a.buttonInstance) {
                        this.registerOnEvent(b, function () {
                            a.buttonInstance.toggle(!a.buttonInstance.pressed);
                            a.functionality.call(a, a.buttonInstance, a.buttonInstance.pressed)
                        })
                    } else {
                        this.registerOnEvent(b, a.functionality)
                    }
                }.bind(this))
            }
        }.bind(this))
    }, isEqual: function (d, c) {
        return d === c || (d.length === c.length && d.all(function (a) {
            return c.include(a)
        }))
    }, isDirty: function (b) {
        return b.any(function (a) {
            return a.isPropertyChanged()
        })
    }, setSelection: function (c, a, b) {
        if (!c) {
            c = []
        }
        if (!(c instanceof Array)) {
            c = [c]
        }
        c = c.findAll(function (d) {
            return d && d instanceof ORYX.Core.Shape
        });
        if (c[0] instanceof ORYX.Core.Canvas) {
            c = []
        }
        if (!b && this.isEqual(this.selection, c) && !this.isDirty(c)) {
            return
        }
        this.selection = c;
        this._subSelection = a;
        this.handleEvents({type: ORYX.CONFIG.EVENT_SELECTION_CHANGED, elements: c, subSelection: a, force: !!b})
    }, updateSelection: function () {
        this.setSelection(this.selection, this._subSelection, true)
    }, getCanvas: function () {
        return this._canvas
    }, createShape: function (o) {
        if (o && o.serialize && o.serialize instanceof Array) {
            var d = o.serialize.find(function (b) {
                return (b.prefix + "-" + b.name) == "oryx-type"
            });
            var t = ORYX.Core.StencilSet.stencil(d.value);
            if (t.type() == "node") {
                var f = new ORYX.Core.Node({eventHandlerCallback: this.handleEvents.bind(this)}, t, this._getPluginFacade())
            } else {
                var f = new ORYX.Core.Edge({eventHandlerCallback: this.handleEvents.bind(this)}, t, this._getPluginFacade())
            }
            this.getCanvas().add(f);
            f.deserialize(o.serialize);
            return f
        }
        if (!o || !o.type || !o.namespace) {
            throw"To create a new shape you have to give an argument with type and namespace"
        }
        var c = this.getCanvas();
        var f;
        var u = o.type;
        var r = ORYX.Core.StencilSet.stencilSet(o.namespace);
        if (r.stencil(u).type() == "node") {
            f = new ORYX.Core.Node({eventHandlerCallback: this.handleEvents.bind(this)}, r.stencil(u), this._getPluginFacade())
        } else {
            f = new ORYX.Core.Edge({eventHandlerCallback: this.handleEvents.bind(this)}, r.stencil(u), this._getPluginFacade())
        }
        if (o.template) {
            f._jsonStencil.properties = o.template._jsonStencil.properties;
            f.postProcessProperties()
        }
        if (o.parent && f instanceof ORYX.Core.Node) {
            o.parent.add(f)
        } else {
            c.add(f)
        }
        var s = o.position ? o.position : {x: 100, y: 200};
        var g;
        if (o.connectingType && o.connectedShape && !(f instanceof ORYX.Core.Edge)) {
            g = new ORYX.Core.Edge({eventHandlerCallback: this.handleEvents.bind(this)}, r.stencil(o.connectingType));
            g.dockers.first().setDockedShape(o.connectedShape);
            var l = o.connectedShape.getDefaultMagnet();
            var a = l ? l.bounds.center() : o.connectedShape.bounds.midPoint();
            g.dockers.first().setReferencePoint(a);
            g.dockers.last().setDockedShape(f);
            g.dockers.last().setReferencePoint(f.getDefaultMagnet().bounds.center());
            c.add(g)
        }
        if (f instanceof ORYX.Core.Edge && o.connectedShape) {
            f.dockers.first().setDockedShape(o.connectedShape);
            if (o.connectedShape instanceof ORYX.Core.Node) {
                f.dockers.first().setReferencePoint(o.connectedShape.getDefaultMagnet().bounds.center());
                f.dockers.last().bounds.centerMoveTo(s)
            } else {
                f.dockers.first().setReferencePoint(o.connectedShape.bounds.midPoint())
            }
            var k = f.dockers.first();
            var e = f.dockers.last();
            if (k.getDockedShape() && e.getDockedShape()) {
                var q = k.getAbsoluteReferencePoint();
                var n = e.getAbsoluteReferencePoint();
                var p = f.createDocker();
                p.bounds.centerMoveTo({x: q.x + (endPont.x - q.x) / 2, y: q.y + (endPont.y - q.y) / 2})
            }
        } else {
            var v = f.bounds;
            if (f instanceof ORYX.Core.Node && f.dockers.length == 1) {
                v = f.dockers.first().bounds
            }
            v.centerMoveTo(s);
            var h = v.upperLeft();
            v.moveBy(-Math.min(h.x, 0), -Math.min(h.y, 0));
            var m = v.lowerRight();
            v.moveBy(-Math.max(m.x - c.bounds.width(), 0), -Math.max(m.y - c.bounds.height(), 0))
        }
        if (f instanceof ORYX.Core.Edge) {
            f._update(false)
        }
        if (!(f instanceof ORYX.Core.Edge) && !(o.dontUpdateSelection)) {
            this.setSelection([f])
        }
        if (g && g.alignDockers) {
        }
        if (f.alignDockers) {
            f.alignDockers()
        }
        return f
    }, deleteShape: function (a) {
        if (!a || !a.parent) {
            return
        }
        a.parent.remove(a);
        a.getOutgoingShapes().each(function (c) {
            var b = c.getDockers().first();
            if (b && b.getDockedShape() == a) {
                b.setDockedShape(undefined)
            }
        });
        a.getIncomingShapes().each(function (b) {
            var c = b.getDockers().last();
            if (c && c.getDockedShape() == a) {
                c.setDockedShape(undefined)
            }
        });
        a.getDockers().each(function (b) {
            b.setDockedShape(undefined)
        })
    }, getModelMetaData: function () {
        return this.modelMetaData
    }, _executeEventImmediately: function (a) {
        if (this.DOMEventListeners.keys().member(a.event.type)) {
            this.DOMEventListeners[a.event.type].each((function (b) {
                b(a.event, a.arg)
            }).bind(this))
        }
    }, _executeEvents: function () {
        this._queueRunning = true;
        while (this._eventsQueue.length > 0) {
            var a = this._eventsQueue.shift();
            this._executeEventImmediately(a)
        }
        this._queueRunning = false
    }, handleEvents: function (b, a) {
        ORYX.Log.trace("Dispatching event type %0 on %1", b.type, a);
        switch (b.type) {
            case ORYX.CONFIG.EVENT_MOUSEDOWN:
                this._handleMouseDown(b, a);
                break;
            case ORYX.CONFIG.EVENT_MOUSEMOVE:
                this._handleMouseMove(b, a);
                break;
            case ORYX.CONFIG.EVENT_MOUSEUP:
                this._handleMouseUp(b, a);
                break;
            case ORYX.CONFIG.EVENT_MOUSEOVER:
                this._handleMouseHover(b, a);
                break;
            case ORYX.CONFIG.EVENT_MOUSEOUT:
                this._handleMouseOut(b, a);
                break
        }
        if (b.forceExecution) {
            this._executeEventImmediately({event: b, arg: a})
        } else {
            this._eventsQueue.push({event: b, arg: a})
        }
        if (!this._queueRunning) {
            this._executeEvents()
        }
        return false
    }, isValidEvent: function (c) {
        try {
            var a = ["INPUT", "TEXTAREA"].include(c.target.tagName.toUpperCase());
            var b = c.target.className.include("x-grid3-focus") && !c.target.className.include("x-grid3-focus-canvas");
            return !a && !b
        } catch (c) {
            return false
        }
    }, catchKeyUpEvents: function (b) {
        if (!this._keyupEnabled) {
            return
        }
        if (!b) {
            b = window.event
        }
        if (!this.isValidEvent(b)) {
            return
        }
        var a = this.createKeyCombEvent(b, ORYX.CONFIG.KEY_ACTION_UP);
        ORYX.Log.debug("Key Event to handle: %0", a);
        this.handleEvents({type: a, event: b})
    }, catchKeyDownEvents: function (b) {
        if (!this._keydownEnabled) {
            return
        }
        if (!b) {
            b = window.event
        }
        if (!this.isValidEvent(b)) {
            return
        }
        var a = this.createKeyCombEvent(b, ORYX.CONFIG.KEY_ACTION_DOWN);
        ORYX.Log.debug("Key Event to handle: %0", a);
        this.handleEvents({type: a, event: b})
    }, createKeyCombEvent: function (c, b) {
        var d = c.which || c.keyCode;
        var a = "key.event";
        if (b) {
            a += "." + b
        }
        if (c.ctrlKey || c.metaKey) {
            a += "." + ORYX.CONFIG.META_KEY_META_CTRL
        }
        if (c.altKey) {
            a += "." + ORYX.CONFIG.META_KEY_ALT
        }
        if (c.shiftKey) {
            a += "." + ORYX.CONFIG.META_KEY_SHIFT
        }
        return a + "." + d
    }, _handleMouseDown: function (a, l) {
        var b = this.getCanvas();
        b.focus();
        var d = a.currentTarget;
        var c = l;
        var g = (c !== null) && (c !== undefined) && (c.isSelectable);
        var m = (c !== null) && (c !== undefined) && (c.isMovable);
        var k = a.shiftKey || a.ctrlKey;
        var h = this.selection.length === 0;
        var e = this.selection.member(c);
        if (g && h) {
            this.setSelection([c]);
            ORYX.Log.trace("Rule #1 applied for mouse down on %0", d.id)
        } else {
            if (g && !h && !k && !e) {
                this.setSelection([c]);
                ORYX.Log.trace("Rule #3 applied for mouse down on %0", d.id)
            } else {
                if (g && k && !e) {
                    var f = this.selection.clone();
                    f.push(c);
                    this.setSelection(f);
                    ORYX.Log.trace("Rule #4 applied for mouse down on %0", d.id)
                } else {
                    if (g && e && k) {
                        var f = this.selection.clone();
                        this.setSelection(f.without(c));
                        ORYX.Log.trace("Rule #6 applied for mouse down on %0", c.id)
                    } else {
                        if (!g && !m) {
                            this.setSelection([]);
                            ORYX.Log.trace("Rule #2 applied for mouse down on %0", d.id);
                            return
                        } else {
                            if (!g && m && !(c instanceof ORYX.Core.Controls.Docker)) {
                                ORYX.Log.trace("Rule #7 applied for mouse down on %0", d.id)
                            } else {
                                if (g && e && !k) {
                                    this._subSelection = this._subSelection != c ? c : undefined;
                                    this.setSelection(this.selection, this._subSelection);
                                    ORYX.Log.trace("Rule #8 applied for mouse down on %0", d.id)
                                }
                            }
                        }
                    }
                }
            }
        }
        return
    }, _handleMouseMove: function (b, a) {
        return
    }, _handleMouseUp: function (d, c) {
        var a = this.getCanvas();
        var e = c;
        var b = this.eventCoordinates(d)
    }, _handleMouseHover: function (b, a) {
        return
    }, _handleMouseOut: function (b, a) {
        return
    }, eventCoordinates: function (f) {
        var b = this.getCanvas();
        var g = b.node.ownerSVGElement.createSVGPoint();
        g.x = f.clientX;
        g.y = f.clientY;
        var e = 1;
        if (!isNaN(screen.logicalXDPI) && !isNaN(screen.systemXDPI)) {
            var c = navigator.userAgent;
            if (c.indexOf("MSIE") >= 0) {
                var d = Math.round((screen.deviceXDPI / screen.logicalXDPI) * 100);
                if (d !== 100) {
                    e = d / 100
                }
            }
        }
        if (e !== 1) {
            g.x = g.x * e;
            g.y = g.y * e
        }
        var a = b.node.getScreenCTM();
        return g.matrixTransform(a.inverse())
    }, eventCoordinatesXY: function (a, h) {
        var c = this.getCanvas();
        var g = c.node.ownerSVGElement.createSVGPoint();
        g.x = a;
        g.y = h;
        var f = 1;
        if (!isNaN(screen.logicalXDPI) && !isNaN(screen.systemXDPI)) {
            var d = navigator.userAgent;
            if (d.indexOf("MSIE") >= 0) {
                var e = Math.round((screen.deviceXDPI / screen.logicalXDPI) * 100);
                if (e !== 100) {
                    f = e / 100
                }
            }
        }
        if (f !== 1) {
            g.x = g.x * f;
            g.y = g.y * f
        }
        var b = c.node.getScreenCTM();
        return g.matrixTransform(b.inverse())
    }
};
ORYX.Editor = Clazz.extend(ORYX.Editor);
ORYX.Editor.createByUrl = function (a) {
    new Ajax.Request(a, {
        method: "GET", onSuccess: function (c) {
            var b = JSON.parse(c.responseText);
            new ORYX.Editor(b)
        }.bind(this)
    })
};
ORYX.Editor.graft = function (g, f, d, l) {
    l = (l || (f && f.ownerDocument) || document);
    var h;
    if (d === undefined) {
        throw"Can't graft an undefined value"
    } else {
        if (d.constructor == String) {
            h = l.createTextNode(d)
        } else {
            for (var c = 0; c < d.length; c++) {
                if (c === 0 && d[c].constructor == String) {
                    var a;
                    a = d[c].match(/^([a-z][a-z0-9]*)\.([^\s\.]+)$/i);
                    if (a) {
                        h = l.createElementNS(g, a[1]);
                        h.setAttributeNS(null, "class", a[2]);
                        continue
                    }
                    a = d[c].match(/^([a-z][a-z0-9]*)$/i);
                    if (a) {
                        h = l.createElementNS(g, a[1]);
                        continue
                    }
                    h = l.createElementNS(g, "span");
                    h.setAttribute(null, "class", "namelessFromLOL")
                }
                if (d[c] === undefined) {
                    throw"Can't graft an undefined value in a list!"
                } else {
                    if (d[c].constructor == String || d[c].constructor == Array) {
                        this.graft(g, h, d[c], l)
                    } else {
                        if (d[c].constructor == Number) {
                            this.graft(g, h, d[c].toString(), l)
                        } else {
                            if (d[c].constructor == Object) {
                                for (var b in d[c]) {
                                    h.setAttributeNS(null, b, d[c][b])
                                }
                            } else {
                            }
                        }
                    }
                }
            }
        }
    }
    if (f && f.appendChild) {
        f.appendChild(h)
    } else {
    }
    return h
};
ORYX.Editor.provideId = function () {
    var b = [], c = "0123456789ABCDEF";
    for (var a = 0; a < 36; a++) {
        b[a] = Math.floor(Math.random() * 16)
    }
    b[14] = 4;
    b[19] = (b[19] & 3) | 8;
    for (var a = 0; a < 36; a++) {
        b[a] = c[b[a]]
    }
    b[8] = b[13] = b[18] = b[23] = "-";
    return "oryx_" + b.join("")
};
ORYX.Editor.resizeFix = function () {
    if (!ORYX.Editor._resizeFixTimeout) {
        ORYX.Editor._resizeFixTimeout = window.setTimeout(function () {
            window.resizeBy(1, 1);
            window.resizeBy(-1, -1);
            ORYX.Editor._resizefixTimeout = null
        }, 100)
    }
};
ORYX.Editor.Cookie = {
    callbacks: [], onChange: function (b, a) {
        this.callbacks.push(b);
        this.start(a)
    }, start: function (a) {
        if (this.pe) {
            return
        }
        var b = document.cookie;
        this.pe = new PeriodicalExecuter(function () {
            if (b != document.cookie) {
                b = document.cookie;
                this.callbacks.each(function (c) {
                    c(this.getParams())
                }.bind(this))
            }
        }.bind(this), (a || 10000) / 1000)
    }, stop: function () {
        if (this.pe) {
            this.pe.stop();
            this.pe = null
        }
    }, getParams: function () {
        var a = {};
        var b = document.cookie;
        b.split("; ").each(function (c) {
            a[c.split("=")[0]] = c.split("=")[1]
        });
        return a
    }, toString: function () {
        return document.cookie
    }
};
ORYX.Editor.SVGClassElementsAreAvailable = true;
ORYX.Editor.setMissingClasses = function () {
    try {
        SVGElement
    } catch (a) {
        ORYX.Editor.SVGClassElementsAreAvailable = false;
        SVGSVGElement = document.createElementNS("http://www.w3.org/2000/svg", "svg").toString();
        SVGGElement = document.createElementNS("http://www.w3.org/2000/svg", "g").toString();
        SVGPathElement = document.createElementNS("http://www.w3.org/2000/svg", "path").toString();
        SVGTextElement = document.createElementNS("http://www.w3.org/2000/svg", "text").toString();
        SVGRectElement = document.createElementNS("http://www.w3.org/2000/svg", "rect").toString();
        SVGImageElement = document.createElementNS("http://www.w3.org/2000/svg", "image").toString();
        SVGCircleElement = document.createElementNS("http://www.w3.org/2000/svg", "circle").toString();
        SVGEllipseElement = document.createElementNS("http://www.w3.org/2000/svg", "ellipse").toString();
        SVGLineElement = document.createElementNS("http://www.w3.org/2000/svg", "line").toString();
        SVGPolylineElement = document.createElementNS("http://www.w3.org/2000/svg", "polyline").toString();
        SVGPolygonElement = document.createElementNS("http://www.w3.org/2000/svg", "polygon").toString()
    }
};
ORYX.Editor.checkClassType = function (b, a) {
    if (ORYX.Editor.SVGClassElementsAreAvailable) {
        return b instanceof a
    } else {
        return b == a
    }
};
if (!ORYX) {
    var ORYX = {}
}
if (!ORYX.Core) {
    ORYX.Core = {}
}
new function () {
    ORYX.Core.UIEnableDrag = function (e, d, c) {
        this.uiObj = d;
        var f = d.bounds.upperLeft();
        var b = d.node.getScreenCTM();
        this.faktorXY = {x: b.a, y: b.d};
        this.scrollNode = d.node.ownerSVGElement.parentNode.parentNode;
        this.offSetPosition = {
            x: Event.pointerX(e) - (f.x * this.faktorXY.x),
            y: Event.pointerY(e) - (f.y * this.faktorXY.y)
        };
        this.offsetScroll = {x: this.scrollNode.scrollLeft, y: this.scrollNode.scrollTop};
        this.dragCallback = ORYX.Core.UIDragCallback.bind(this);
        this.disableCallback = ORYX.Core.UIDisableDrag.bind(this);
        this.movedCallback = c ? c.movedCallback : undefined;
        this.upCallback = c ? c.upCallback : undefined;
        document.documentElement.addEventListener(ORYX.CONFIG.EVENT_MOUSEUP, this.disableCallback, true);
        document.documentElement.addEventListener(ORYX.CONFIG.EVENT_MOUSEMOVE, this.dragCallback, false)
    };
    ORYX.Core.UIDragCallback = function (b) {
        var a = {x: Event.pointerX(b) - this.offSetPosition.x, y: Event.pointerY(b) - this.offSetPosition.y};
        a.x -= this.offsetScroll.x - this.scrollNode.scrollLeft;
        a.y -= this.offsetScroll.y - this.scrollNode.scrollTop;
        a.x /= this.faktorXY.x;
        a.y /= this.faktorXY.y;
        this.uiObj.bounds.moveTo(a);
        if (this.movedCallback) {
            this.movedCallback(b)
        }
    };
    ORYX.Core.UIDisableDrag = function (a) {
        document.documentElement.removeEventListener(ORYX.CONFIG.EVENT_MOUSEMOVE, this.dragCallback, false);
        document.documentElement.removeEventListener(ORYX.CONFIG.EVENT_MOUSEUP, this.disableCallback, true);
        if (this.upCallback) {
            this.upCallback(a)
        }
        this.upCallback = undefined;
        this.movedCallback = undefined;
        Event.stop(a)
    };
    ORYX.Core.MoveDockersCommand = ORYX.Core.Command.extend({
        construct: function (a) {
            this.dockers = $H(a);
            this.edges = $H({})
        }, execute: function () {
            if (this.changes) {
                this.executeAgain();
                return
            } else {
                this.changes = $H({})
            }
            this.dockers.values().each(function (b) {
                var a = b.docker.parent;
                if (!a) {
                    return
                }
                if (!this.changes[a.getId()]) {
                    this.changes[a.getId()] = {
                        edge: a, oldDockerPositions: a.dockers.map(function (c) {
                            return c.bounds.center()
                        })
                    }
                }
                b.docker.bounds.moveBy(b.offset);
                this.edges[a.getId()] = a;
                b.docker.update()
            }.bind(this));
            this.edges.each(function (a) {
                this.updateEdge(a.value);
                if (this.changes[a.value.getId()]) {
                    this.changes[a.value.getId()].dockerPositions = a.value.dockers.map(function (b) {
                        return b.bounds.center()
                    })
                }
            }.bind(this))
        }, updateEdge: function (a) {
            a._update(true);
            [a.getOutgoingShapes(), a.getIncomingShapes()].flatten().invoke("_update", [true])
        }, executeAgain: function () {
            this.changes.values().each(function (a) {
                this.removeAllDocker(a.edge);
                a.dockerPositions.each(function (d, b) {
                    if (b == 0 || b == a.dockerPositions.length - 1) {
                        return
                    }
                    var c = a.edge.createDocker(undefined, d);
                    c.bounds.centerMoveTo(d);
                    c.update()
                }.bind(this));
                this.updateEdge(a.edge)
            }.bind(this))
        }, rollback: function () {
            this.changes.values().each(function (a) {
                this.removeAllDocker(a.edge);
                a.oldDockerPositions.each(function (d, b) {
                    if (b == 0 || b == a.oldDockerPositions.length - 1) {
                        return
                    }
                    var c = a.edge.createDocker(undefined, d);
                    c.bounds.centerMoveTo(d);
                    c.update()
                }.bind(this));
                this.updateEdge(a.edge)
            }.bind(this))
        }, removeAllDocker: function (a) {
            a.dockers.slice(1, a.dockers.length - 1).each(function (b) {
                a.removeDocker(b)
            })
        }
    })
}();
if (!ORYX) {
    var ORYX = {}
}
if (!ORYX.Core) {
    ORYX.Core = {}
}
ORYX.Core.Shape = {
    construct: function (a, c, b) {
        arguments.callee.$.construct.apply(this, arguments);
        this.facade = b;
        this.dockers = [];
        this.magnets = [];
        this._defaultMagnet;
        this.incoming = [];
        this.outgoing = [];
        this.nodes = [];
        this._dockerChangedCallback = this._dockerChanged.bind(this);
        this._labels = new Hash();
        this.node = ORYX.Editor.graft("http://www.w3.org/2000/svg", null, ["g", {id: "svg-" + this.resourceId}, ["g", {"class": "stencils"}, ["g", {"class": "me"}], ["g", {
            "class": "children",
            style: "overflow:hidden"
        }], ["g", {"class": "edge"}]], ["g", {"class": "controls"}, ["g", {"class": "dockers"}], ["g", {"class": "magnets"}]]])
    }, update: function () {
    }, _update: function () {
    }, refresh: function () {
        arguments.callee.$.refresh.apply(this, arguments);
        if (this.node.ownerDocument) {
            var a = this;
            this.propertiesChanged.each((function (b) {
                if (b.value) {
                    var e = this.properties[b.key];
                    var d = this.getStencil().property(b.key);
                    if (d != undefined) {
                        this.propertiesChanged[b.key] = false;
                        if (d.type() == ORYX.CONFIG.TYPE_CHOICE) {
                            d.refToView().each((function (g) {
                                if (g !== "") {
                                    var f = this._labels[this.id + g];
                                    if (f && d.item(e)) {
                                        f.text(d.item(e).title())
                                    }
                                }
                            }).bind(this));
                            var c = new Hash();
                            d.items().each((function (f) {
                                f.refToView().each((function (g) {
                                    if (g == "") {
                                        return
                                    }
                                    var h = this.node.ownerDocument.getElementById(this.id + g);
                                    if (!h) {
                                        return
                                    }
                                    if (!c[h.id] || e == f.value()) {
                                        h.setAttributeNS(null, "display", ((e == f.value()) ? "inherit" : "none"));
                                        c[h.id] = h
                                    }
                                    if (ORYX.Editor.checkClassType(h, SVGImageElement)) {
                                        h.setAttributeNS("http://www.w3.org/1999/xlink", "href", h.getAttributeNS("http://www.w3.org/1999/xlink", "href"))
                                    }
                                }).bind(this))
                            }).bind(this))
                        } else {
                            d.refToView().each((function (g) {
                                if (g === "") {
                                    return
                                }
                                var f = this.id + g;
                                if (d.type() === ORYX.CONFIG.TYPE_KISBPM_MULTIINSTANCE) {
                                    if (g === "multiinstance") {
                                        var k = this.node.ownerDocument.getElementById(this.id + "parallel");
                                        if (k) {
                                            if (e === "Parallel") {
                                                k.setAttributeNS(null, "display", "inherit")
                                            } else {
                                                k.setAttributeNS(null, "display", "none")
                                            }
                                        }
                                        var n = this.node.ownerDocument.getElementById(this.id + "sequential");
                                        if (n) {
                                            if (e === "Sequential") {
                                                n.setAttributeNS(null, "display", "inherit")
                                            } else {
                                                n.setAttributeNS(null, "display", "none")
                                            }
                                        }
                                    }
                                    return
                                } else {
                                    if (d.type() === "cancelactivity") {
                                        var s = this.node.ownerDocument.getElementById(this.id + "frame");
                                        var t = this.node.ownerDocument.getElementById(this.id + "frame2");
                                        if (e === "true") {
                                            s.setAttributeNS(null, "display", "inherit");
                                            t.setAttributeNS(null, "display", "inherit")
                                        } else {
                                            s.setAttributeNS(null, "display", "none");
                                            t.setAttributeNS(null, "display", "none")
                                        }
                                    }
                                }
                                var h = this.node.ownerDocument.getElementById(f);
                                if (!h || !(h.ownerSVGElement)) {
                                    if (d.type() === ORYX.CONFIG.TYPE_URL || d.type() === ORYX.CONFIG.TYPE_DIAGRAM_LINK) {
                                        var r = this.node.ownerDocument.getElementsByTagNameNS("http://www.w3.org/2000/svg", "a");
                                        h = $A(r).find(function (u) {
                                            return u.getAttributeNS(null, "id") === f
                                        });
                                        if (!h) {
                                            return
                                        }
                                    } else {
                                        return
                                    }
                                }
                                if (d.complexAttributeToView()) {
                                    var p = this._labels[f];
                                    if (p) {
                                        try {
                                            propJson = e.evalJSON();
                                            var q = propJson[d.complexAttributeToView()];
                                            p.text(q ? q : e)
                                        } catch (l) {
                                            p.text(e)
                                        }
                                    }
                                } else {
                                    switch (d.type()) {
                                        case ORYX.CONFIG.TYPE_BOOLEAN:
                                            if (typeof e == "string") {
                                                e = e === "true"
                                            }
                                            h.setAttributeNS(null, "display", (!(e === d.inverseBoolean())) ? "inherit" : "none");
                                            break;
                                        case ORYX.CONFIG.TYPE_COLOR:
                                            if (d.fill()) {
                                                if (h.tagName.toLowerCase() === "stop") {
                                                    if (e) {
                                                        if (d.lightness() && d.lightness() !== 1) {
                                                            e = ORYX.Utils.adjustLightness(e, d.lightness())
                                                        }
                                                        h.setAttributeNS(null, "stop-color", e);
                                                        if (h.parentNode.tagName.toLowerCase() === "radialgradient") {
                                                            ORYX.Utils.adjustGradient(h.parentNode, h)
                                                        }
                                                    }
                                                    if (h.parentNode.tagName.toLowerCase() === "radialgradient") {
                                                        $A(h.parentNode.getElementsByTagName("stop")).each(function (u) {
                                                            u.setAttributeNS(null, "stop-opacity", e ? u.getAttributeNS(ORYX.CONFIG.NAMESPACE_ORYX, "default-stop-opacity") || 1 : 0)
                                                        }.bind(this))
                                                    }
                                                } else {
                                                    h.setAttributeNS(null, "fill", e)
                                                }
                                            }
                                            if (d.stroke()) {
                                                h.setAttributeNS(null, "stroke", e)
                                            }
                                            break;
                                        case ORYX.CONFIG.TYPE_STRING:
                                            var p = this._labels[f];
                                            if (p) {
                                                p.text(e)
                                            }
                                            break;
                                        case ORYX.CONFIG.TYPE_EXPRESSION:
                                            var p = this._labels[f];
                                            if (p) {
                                                p.text(e)
                                            }
                                            break;
                                        case ORYX.CONFIG.TYPE_DATASOURCE:
                                            var p = this._labels[f];
                                            if (p) {
                                                p.text(e)
                                            }
                                            break;
                                        case ORYX.CONFIG.TYPE_INTEGER:
                                            var p = this._labels[f];
                                            if (p) {
                                                p.text(e)
                                            }
                                            break;
                                        case ORYX.CONFIG.TYPE_FLOAT:
                                            if (d.fillOpacity()) {
                                                h.setAttributeNS(null, "fill-opacity", e)
                                            }
                                            if (d.strokeOpacity()) {
                                                h.setAttributeNS(null, "stroke-opacity", e)
                                            }
                                            if (!d.fillOpacity() && !d.strokeOpacity()) {
                                                var p = this._labels[f];
                                                if (p) {
                                                    p.text(e)
                                                }
                                            }
                                            break;
                                        case ORYX.CONFIG.TYPE_SUB_PROCESS_LINK:
                                            if (g == "subprocesslink") {
                                                var m = h.getAttributeNodeNS("", "onclick");
                                                var o = h.getAttributeNodeNS("", "style");
                                                if (m) {
                                                    if (e && e.id) {
                                                        if (o) {
                                                            o.textContent = "cursor:pointer;"
                                                        }
                                                        m.textContent = "KISBPM.TOOLBAR.ACTIONS.navigateToProcess(" + e.id + ");return false;"
                                                    } else {
                                                        if (o) {
                                                            o.textContent = "cursor:default;"
                                                        }
                                                        m.textContent = "return false;"
                                                    }
                                                }
                                            }
                                            break;
                                        case ORYX.CONFIG.TYPE_URL:
                                            break
                                    }
                                }
                            }).bind(this))
                        }
                    }
                }
            }).bind(this));
            this._labels.values().each(function (b) {
                b.update()
            })
        }
    }, layout: function () {
        var a = this.getStencil().layout();
        if (a) {
            a.each(function (b) {
                b.shape = this;
                b.forceExecution = true;
                this._delegateEvent(b)
            }.bind(this))
        }
    }, getLabels: function () {
        return this._labels.values()
    }, getLabel: function (a) {
        if (!a) {
            return null
        }
        return (this._labels.find(function (b) {
            return b.key.endsWith(a)
        }) || {}).value || null
    }, hideLabels: function () {
        this.getLabels().invoke("hide")
    }, showLabels: function () {
        var a = this.getLabels();
        a.invoke("show");
        a.each(function (b) {
            b.update()
        })
    }, setOpacity: function (b, a) {
        b = Math.max(Math.min((typeof b == "number" ? b : 1), 1), 0);
        if (b !== 1) {
            b = String(b);
            this.node.setAttributeNS(null, "fill-opacity", b);
            this.node.setAttributeNS(null, "stroke-opacity", b)
        } else {
            this.node.removeAttributeNS(null, "fill-opacity");
            this.node.removeAttributeNS(null, "stroke-opacity")
        }
    }, getDockers: function () {
        return this.dockers
    }, getMagnets: function () {
        return this.magnets
    }, getDefaultMagnet: function () {
        if (this._defaultMagnet) {
            return this._defaultMagnet
        } else {
            if (this.magnets.length > 0) {
                return this.magnets[0]
            } else {
                return undefined
            }
        }
    }, getParentShape: function () {
        return this.parent
    }, getIncomingShapes: function (a) {
        if (a) {
            this.incoming.each(a)
        }
        return this.incoming
    }, getIncomingNodes: function (a) {
        return this.incoming.select(function (b) {
            var c = (b instanceof ORYX.Core.Node);
            if (c && a) {
                a(b)
            }
            return c
        })
    }, getOutgoingShapes: function (a) {
        if (a) {
            this.outgoing.each(a)
        }
        return this.outgoing
    }, getOutgoingNodes: function (a) {
        return this.outgoing.select(function (b) {
            var c = (b instanceof ORYX.Core.Node);
            if (c && a) {
                a(b)
            }
            return c
        })
    }, getAllDockedShapes: function (b) {
        var a = this.incoming.concat(this.outgoing);
        if (b) {
            a.each(b)
        }
        return a
    }, getCanvas: function () {
        if (this.parent instanceof ORYX.Core.Canvas) {
            return this.parent
        } else {
            if (this.parent instanceof ORYX.Core.Shape) {
                return this.parent.getCanvas()
            } else {
                return undefined
            }
        }
    }, getChildNodes: function (b, c) {
        if (!b && !c) {
            return this.nodes.clone()
        } else {
            var a = [];
            this.nodes.each(function (d) {
                if (!d.isVisible) {
                    return
                }
                if (c) {
                    c(d)
                }
                a.push(d);
                if (b && d instanceof ORYX.Core.Shape) {
                    a = a.concat(d.getChildNodes(b, c))
                }
            });
            return a
        }
    }, add: function (b, d, c) {
        if (b instanceof ORYX.Core.UIObject && !(b instanceof ORYX.Core.Edge)) {
            if (!(this.children.member(b))) {
                if (b.parent) {
                    b.parent.remove(b, true)
                }
                if (d != undefined) {
                    this.children.splice(d, 0, b)
                } else {
                    this.children.push(b)
                }
                b.parent = this;
                var e;
                if (b instanceof ORYX.Core.Node) {
                    e = this.node.childNodes[0].childNodes[1];
                    this.nodes.push(b)
                } else {
                    if (b instanceof ORYX.Core.Controls.Control) {
                        var a = this.node.childNodes[1];
                        if (b instanceof ORYX.Core.Controls.Docker) {
                            e = a.childNodes[0];
                            if (this.dockers.length >= 2) {
                                this.dockers.splice(d !== undefined ? Math.min(d, this.dockers.length - 1) : this.dockers.length - 1, 0, b)
                            } else {
                                this.dockers.push(b)
                            }
                        } else {
                            if (b instanceof ORYX.Core.Controls.Magnet) {
                                e = a.childNodes[1];
                                this.magnets.push(b)
                            } else {
                                e = a
                            }
                        }
                    } else {
                        e = this.node
                    }
                }
                if (d != undefined && d < e.childNodes.length) {
                    b.node = e.insertBefore(b.node, e.childNodes[d])
                } else {
                    b.node = e.appendChild(b.node)
                }
                this._changed();
                if (this.eventHandlerCallback && c !== true) {
                    this.eventHandlerCallback({type: ORYX.CONFIG.EVENT_SHAPEADDED, shape: b})
                }
            } else {
                ORYX.Log.warn("add: ORYX.Core.UIObject is already a child of this object.")
            }
        } else {
            ORYX.Log.warn("add: Parameter is not of type ORYX.Core.UIObject.")
        }
    }, remove: function (a, b) {
        if (this.children.member(a)) {
            var c = a.parent;
            this.children = this.children.without(a);
            a.parent = undefined;
            if (a instanceof ORYX.Core.Shape) {
                if (a instanceof ORYX.Core.Edge) {
                    a.removeMarkers();
                    a.node = this.node.childNodes[0].childNodes[2].removeChild(a.node)
                } else {
                    a.node = this.node.childNodes[0].childNodes[1].removeChild(a.node);
                    this.nodes = this.nodes.without(a)
                }
            } else {
                if (a instanceof ORYX.Core.Controls.Control) {
                    if (a instanceof ORYX.Core.Controls.Docker) {
                        a.node = this.node.childNodes[1].childNodes[0].removeChild(a.node);
                        this.dockers = this.dockers.without(a)
                    } else {
                        if (a instanceof ORYX.Core.Controls.Magnet) {
                            a.node = this.node.childNodes[1].childNodes[1].removeChild(a.node);
                            this.magnets = this.magnets.without(a)
                        } else {
                            a.node = this.node.childNodes[1].removeChild(a.node)
                        }
                    }
                }
            }
            if (this.eventHandlerCallback && b !== true) {
                this.eventHandlerCallback({type: ORYX.CONFIG.EVENT_SHAPEREMOVED, shape: a, parent: c})
            }
            this._changed()
        } else {
            ORYX.Log.warn("remove: ORYX.Core.UIObject is not a child of this object.")
        }
    }, getIntersectionPoint: function () {
        var p, o, h, g;
        switch (arguments.length) {
            case 2:
                p = arguments[0].x;
                o = arguments[0].y;
                h = arguments[1].x;
                g = arguments[1].y;
                break;
            case 4:
                p = arguments[0];
                o = arguments[1];
                h = arguments[2];
                g = arguments[3];
                break;
            default:
                throw"getIntersectionPoints needs two or four arguments"
        }
        var d, b, e, c;
        var a = this.absoluteBounds();
        if (this.isPointIncluded(p, o, a)) {
            d = p;
            b = o
        } else {
            e = p;
            c = o
        }
        if (this.isPointIncluded(h, g, a)) {
            d = h;
            b = g
        } else {
            e = h;
            c = g
        }
        if (!d || !b || !e || !c) {
            return undefined
        }
        var n = 0;
        var m = 0;
        var r, q;
        var l = 1;
        var k = 0;
        while (true) {
            var n = Math.min(d, e) + ((Math.max(d, e) - Math.min(d, e)) / 2);
            var m = Math.min(b, c) + ((Math.max(b, c) - Math.min(b, c)) / 2);
            if (this.isPointIncluded(n, m, a)) {
                d = n;
                b = m
            } else {
                e = n;
                c = m
            }
            var f = Math.sqrt(Math.pow(d - e, 2) + Math.pow(b - c, 2));
            r = d + ((e - d) / f), q = b + ((c - b) / f);
            if (!this.isPointIncluded(r, q, a)) {
                break
            }
        }
        return {x: r, y: q}
    }, isPointIncluded: function () {
        return false
    }, containsNode: function (b) {
        var a = this.node.firstChild.firstChild;
        while (b) {
            if (b == a) {
                return true
            }
            b = b.parentNode
        }
        return false
    }, isPointOverOffset: function () {
        return this.isPointIncluded.apply(this, arguments)
    }, _dockerChanged: function () {
    }, createDocker: function (b, a) {
        var c = new ORYX.Core.Controls.Docker({eventHandlerCallback: this.eventHandlerCallback});
        c.bounds.registerCallback(this._dockerChangedCallback);
        if (a) {
            c.bounds.centerMoveTo(a)
        }
        this.add(c, b);
        return c
    }, serialize: function () {
        var a = arguments.callee.$.serialize.apply(this);
        a.push({name: "bounds", prefix: "oryx", value: this.bounds.serializeForERDF(), type: "literal"});
        this.getOutgoingShapes().each((function (b) {
            a.push({
                name: "outgoing",
                prefix: "raziel",
                value: "#" + ERDF.__stripHashes(b.resourceId),
                type: "resource"
            })
        }).bind(this));
        a.push({
            name: "parent",
            prefix: "raziel",
            value: "#" + ERDF.__stripHashes(this.parent.resourceId),
            type: "resource"
        });
        return a
    }, deserialize: function (d, c) {
        arguments.callee.$.deserialize.apply(this, arguments);
        var e = d.find(function (b) {
            return "oryx-bounds" === (b.prefix + "-" + b.name)
        });
        if (e) {
            var a = e.value.replace(/,/g, " ").split(" ").without("");
            if (this instanceof ORYX.Core.Edge) {
                if (!this.dockers.first().isChanged) {
                    this.dockers.first().bounds.centerMoveTo(parseFloat(a[0]), parseFloat(a[1]))
                }
                if (!this.dockers.last().isChanged) {
                    this.dockers.last().bounds.centerMoveTo(parseFloat(a[2]), parseFloat(a[3]))
                }
            } else {
                this.bounds.set(parseFloat(a[0]), parseFloat(a[1]), parseFloat(a[2]), parseFloat(a[3]))
            }
        }
        if (c && c.labels instanceof Array) {
            c.labels.each(function (b) {
                var f = this.getLabel(b.ref);
                if (f) {
                    f.deserialize(b, this)
                }
            }.bind(this))
        }
    }, toJSON: function () {
        var a = arguments.callee.$.toJSON.apply(this, arguments);
        var c = [], b = this.id;
        this._labels.each(function (e) {
            var d = e.value.serialize();
            if (d) {
                d.ref = e.key.replace(b, "");
                c.push(d)
            }
        });
        if (c.length > 0) {
            a.labels = c
        }
        return a
    }, _init: function (a) {
        this._adjustIds(a, 0)
    }, _adjustIds: function (c, e) {
        if (c instanceof Element) {
            var a = c.getAttributeNS(null, "id");
            if (a && a !== "") {
                c.setAttributeNS(null, "id", this.id + a)
            } else {
                c.setAttributeNS(null, "id", this.id + "_" + this.id + "_" + e);
                e++
            }
            var d = c.getAttributeNS(null, "fill");
            if (d && d.include("url(#")) {
                d = d.replace(/url\(#/g, "url(#" + this.id);
                c.setAttributeNS(null, "fill", d)
            }
            if (c.hasChildNodes()) {
                for (var b = 0; b < c.childNodes.length; b++) {
                    e = this._adjustIds(c.childNodes[b], e)
                }
            }
        }
        return e
    }, toString: function () {
        return "ORYX.Core.Shape " + this.getId()
    }
};
ORYX.Core.Shape = ORYX.Core.AbstractShape.extend(ORYX.Core.Shape);
if (!ORYX) {
    var ORYX = {}
}
if (!ORYX.Core) {
    ORYX.Core = {}
}
if (!ORYX.Core.Controls) {
    ORYX.Core.Controls = {}
}
ORYX.Core.Controls.Control = ORYX.Core.UIObject.extend({
    toString: function () {
        return "Control " + this.id
    }
});
if (!ORYX) {
    var ORYX = {}
}
if (!ORYX.Core) {
    ORYX.Core = {}
}
if (!ORYX.Core.Controls) {
    ORYX.Core.Controls = {}
}
ORYX.Core.Controls.Docker = ORYX.Core.Controls.Control.extend({
    construct: function () {
        arguments.callee.$.construct.apply(this, arguments);
        this.isMovable = true;
        this.bounds.set(0, 0, 16, 16);
        this.referencePoint = undefined;
        this._dockedShapeBounds = undefined;
        this._dockedShape = undefined;
        this._oldRefPoint1 = undefined;
        this._oldRefPoint2 = undefined;
        this.anchorLeft;
        this.anchorRight;
        this.anchorTop;
        this.anchorBottom;
        this.node = ORYX.Editor.graft("http://www.w3.org/2000/svg", null, ["g"]);
        this._dockerNode = ORYX.Editor.graft("http://www.w3.org/2000/svg", this.node, ["g", {"pointer-events": "all"}, ["circle", {
            cx: "8",
            cy: "8",
            r: "8",
            stroke: "none",
            fill: "none"
        }], ["circle", {cx: "8", cy: "8", r: "3", stroke: "black", fill: "red", "stroke-width": "1"}]]);
        this._referencePointNode = ORYX.Editor.graft("http://www.w3.org/2000/svg", this.node, ["g", {"pointer-events": "none"}, ["circle", {
            cx: this.bounds.upperLeft().x,
            cy: this.bounds.upperLeft().y,
            r: 3,
            fill: "red",
            "fill-opacity": 0.4
        }]]);
        this.hide();
        this.addEventHandlers(this._dockerNode);
        this._updateCallback = this._changed.bind(this)
    }, update: function () {
        if (this._dockedShape) {
            if (this._dockedShapeBounds && this._dockedShape instanceof ORYX.Core.Node) {
                var g = this._dockedShapeBounds.width();
                var d = this._dockedShapeBounds.height();
                if (!g) {
                    g = 1
                }
                if (!d) {
                    d = 1
                }
                var o = this._dockedShape.bounds.width() / g;
                var m = this._dockedShape.bounds.height() / d;
                if (o !== 1 || m !== 1) {
                    this.referencePoint.x *= o;
                    this.referencePoint.y *= m
                }
                this._dockedShapeBounds = this._dockedShape.bounds.clone()
            }
            var b = this.parent.dockers.indexOf(this);
            var f = this;
            var e = this.parent.dockers.length > 1 ? (b === 0 ? this.parent.dockers[b + 1] : this.parent.dockers[b - 1]) : undefined;
            var n = f.getDockedShape() ? f.getAbsoluteReferencePoint() : f.bounds.center();
            var k = e && e.getDockedShape() ? e.getAbsoluteReferencePoint() : e ? e.bounds.center() : undefined;
            if (!k) {
                var a = this._dockedShape.absoluteCenterXY();
                var l = this._dockedShape.bounds.width() * this._dockedShape.bounds.height();
                k = {x: n.x + (a.x - n.x) * -l, y: n.y + (a.y - n.y) * -l}
            }
            var c = undefined;
            c = this._dockedShape.getIntersectionPoint(n, k);
            if (!c) {
                c = this.getAbsoluteReferencePoint()
            }
            if (this.parent && this.parent.parent) {
                var h = this.parent.parent.absoluteXY();
                c.x -= h.x;
                c.y -= h.y
            }
            this.bounds.centerMoveTo(c);
            this._oldRefPoint1 = n;
            this._oldRefPoint2 = k
        }
        arguments.callee.$.update.apply(this, arguments)
    }, refresh: function () {
        arguments.callee.$.refresh.apply(this, arguments);
        var a = this.bounds.upperLeft();
        this._dockerNode.setAttributeNS(null, "transform", "translate(" + a.x + ", " + a.y + ")");
        a = Object.clone(this.referencePoint);
        if (a && this._dockedShape) {
            var b;
            if (this.parent instanceof ORYX.Core.Edge) {
                b = this._dockedShape.absoluteXY()
            } else {
                b = this._dockedShape.bounds.upperLeft()
            }
            a.x += b.x;
            a.y += b.y
        } else {
            a = this.bounds.center()
        }
        this._referencePointNode.setAttributeNS(null, "transform", "translate(" + a.x + ", " + a.y + ")")
    }, setReferencePoint: function (a) {
        if (this.referencePoint !== a && (!this.referencePoint || !a || this.referencePoint.x !== a.x || this.referencePoint.y !== a.y)) {
            this.referencePoint = a;
            this._changed()
        }
    }, getAbsoluteReferencePoint: function () {
        if (!this.referencePoint || !this._dockedShape) {
            return undefined
        } else {
            var a = this._dockedShape.absoluteXY();
            return {x: this.referencePoint.x + a.x, y: this.referencePoint.y + a.y}
        }
    }, setDockedShape: function (b) {
        if (this._dockedShape) {
            this._dockedShape.bounds.unregisterCallback(this._updateCallback);
            if (this === this.parent.dockers.first()) {
                this.parent.incoming = this.parent.incoming.without(this._dockedShape);
                this._dockedShape.outgoing = this._dockedShape.outgoing.without(this.parent)
            } else {
                if (this === this.parent.dockers.last()) {
                    this.parent.outgoing = this.parent.outgoing.without(this._dockedShape);
                    this._dockedShape.incoming = this._dockedShape.incoming.without(this.parent)
                }
            }
        }
        this._dockedShape = b;
        this._dockedShapeBounds = undefined;
        var a = undefined;
        if (this._dockedShape) {
            if (this === this.parent.dockers.first()) {
                this.parent.incoming.push(b);
                b.outgoing.push(this.parent)
            } else {
                if (this === this.parent.dockers.last()) {
                    this.parent.outgoing.push(b);
                    b.incoming.push(this.parent)
                }
            }
            var c = this.bounds;
            var d = b.absoluteXY();
            a = {x: c.center().x - d.x, y: c.center().y - d.y};
            this._dockedShapeBounds = this._dockedShape.bounds.clone();
            this._dockedShape.bounds.registerCallback(this._updateCallback);
            this.setDockerColor(ORYX.CONFIG.DOCKER_DOCKED_COLOR)
        } else {
            this.setDockerColor(ORYX.CONFIG.DOCKER_UNDOCKED_COLOR)
        }
        this.setReferencePoint(a);
        this._changed()
    }, getDockedShape: function () {
        return this._dockedShape
    }, isDocked: function () {
        return !!this._dockedShape
    }, setDockerColor: function (a) {
        this._dockerNode.lastChild.setAttributeNS(null, "fill", a)
    }, preventHiding: function (a) {
        this._preventHiding = Math.max(0, (this._preventHiding || 0) + (a ? 1 : -1))
    }, hide: function () {
        if (this._preventHiding) {
            return false
        }
        this.node.setAttributeNS(null, "visibility", "hidden");
        this._referencePointNode.setAttributeNS(null, "visibility", "hidden");
        this.children.each(function (a) {
            a.hide()
        })
    }, show: function () {
        this.node.setAttributeNS(null, "visibility", "visible");
        if (this.getDockedShape() instanceof ORYX.Core.Edge) {
            this._referencePointNode.setAttributeNS(null, "visibility", "hidden")
        } else {
            this._referencePointNode.setAttributeNS(null, "visibility", "visible")
        }
        this.children.each(function (a) {
            a.show()
        })
    }, toString: function () {
        return "Docker " + this.id
    }
});
if (!ORYX) {
    var ORYX = {}
}
if (!ORYX.Core) {
    ORYX.Core = {}
}
if (!ORYX.Core.Controls) {
    ORYX.Core.Controls = {}
}
ORYX.Core.Controls.Magnet = ORYX.Core.Controls.Control.extend({
    construct: function () {
        arguments.callee.$.construct.apply(this, arguments);
        this.anchorLeft;
        this.anchorRight;
        this.anchorTop;
        this.anchorBottom;
        this.bounds.set(0, 0, 16, 16);
        this.node = ORYX.Editor.graft("http://www.w3.org/2000/svg", null, ["g", {"pointer-events": "all"}, ["circle", {
            cx: "8",
            cy: "8",
            r: "4",
            stroke: "none",
            fill: "red",
            "fill-opacity": "0.3"
        }],]);
        this.hide()
    }, update: function () {
        arguments.callee.$.update.apply(this, arguments)
    }, _update: function () {
        arguments.callee.$.update.apply(this, arguments)
    }, refresh: function () {
        arguments.callee.$.refresh.apply(this, arguments);
        var a = this.bounds.upperLeft();
        this.node.setAttributeNS(null, "transform", "translate(" + a.x + ", " + a.y + ")")
    }, show: function () {
        arguments.callee.$.show.apply(this, arguments)
    }, toString: function () {
        return "Magnet " + this.id
    }
});
if (!ORYX) {
    var ORYX = {}
}
if (!ORYX.Core) {
    ORYX.Core = {}
}
ORYX.Core.Node = {
    construct: function (a, c, b) {
        arguments.callee.$.construct.apply(this, arguments);
        this.isSelectable = true;
        this.isMovable = true;
        this._dockerUpdated = false;
        this.facade = b;
        this._oldBounds = new ORYX.Core.Bounds();
        this._svgShapes = [];
        this.minimumSize = undefined;
        this.maximumSize = undefined;
        this.isHorizontallyResizable = false;
        this.isVerticallyResizable = false;
        this.dataId = undefined;
        this._init(this._stencil.view());
        this.forcedHeight = -1
    }, _update: function () {
        this.dockers.invoke("update");
        if (this.isChanged) {
            var c = this.bounds;
            var d = this._oldBounds;
            if (this.isResized) {
                var o = c.width() / d.width();
                var n = c.height() / d.height();
                this._svgShapes.each(function (w) {
                    if (w.isHorizontallyResizable) {
                        w.width = w.oldWidth * o
                    }
                    if (w.isVerticallyResizable) {
                        w.height = w.oldHeight * n
                    }
                    var v;
                    var s = w.anchorLeft;
                    var u = w.anchorRight;
                    if (u) {
                        v = d.width() - (w.oldX + w.oldWidth);
                        if (s) {
                            w.width = c.width() - w.x - v
                        } else {
                            w.x = c.width() - (v + w.width)
                        }
                    } else {
                        if (!s) {
                            w.x = o * w.oldX;
                            if (!w.isHorizontallyResizable) {
                                w.x = w.x + w.width * o / 2 - w.width / 2
                            }
                        }
                    }
                    var p = w.anchorTop;
                    var t = w.anchorBottom;
                    if (t) {
                        v = d.height() - (w.oldY + w.oldHeight);
                        if (p) {
                            w.height = c.height() - w.y - v
                        } else {
                            if (!w._isYLocked) {
                                w.y = c.height() - (v + w.height)
                            }
                        }
                    } else {
                        if (!p) {
                            w.y = n * w.oldY;
                            if (!w.isVerticallyResizable) {
                                w.y = w.y + w.height * n / 2 - w.height / 2
                            }
                        }
                    }
                });
                var g = {x: 0, y: 0};
                if (!this.isHorizontallyResizable && c.width() !== d.width()) {
                    g.x = d.width() - c.width()
                }
                if (!this.isVerticallyResizable && c.height() !== d.height()) {
                    g.y = d.height() - c.height()
                }
                if (g.x !== 0 || g.y !== 0) {
                    c.extend(g)
                }
                g = {x: 0, y: 0};
                var e, k;
                if (this.minimumSize) {
                    ORYX.Log.debug("Shape (%0)'s min size: (%1x%2)", this, this.minimumSize.width, this.minimumSize.height);
                    e = this.minimumSize.width - c.width();
                    if (e > 0) {
                        g.x += e
                    }
                    k = this.minimumSize.height - c.height();
                    if (k > 0) {
                        g.y += k
                    }
                }
                if (this.maximumSize) {
                    ORYX.Log.debug("Shape (%0)'s max size: (%1x%2)", this, this.maximumSize.width, this.maximumSize.height);
                    e = c.width() - this.maximumSize.width;
                    if (e > 0) {
                        g.x -= e
                    }
                    k = c.height() - this.maximumSize.height;
                    if (k > 0) {
                        g.y -= k
                    }
                }
                if (g.x !== 0 || g.y !== 0) {
                    c.extend(g)
                }
                var o = c.width() / d.width();
                var n = c.height() / d.height();
                var m, l, q, f, b, a, r;
                this.magnets.each(function (p) {
                    m = p.anchorLeft;
                    l = p.anchorRight;
                    q = p.anchorTop;
                    f = p.anchorBottom;
                    b = p.bounds.center();
                    if (m) {
                        a = b.x
                    } else {
                        if (l) {
                            a = c.width() - (d.width() - b.x)
                        } else {
                            a = b.x * o
                        }
                    }
                    if (q) {
                        r = b.y
                    } else {
                        if (f) {
                            r = c.height() - (d.height() - b.y)
                        } else {
                            r = b.y * n
                        }
                    }
                    if (b.x !== a || b.y !== r) {
                        p.bounds.centerMoveTo(a, r)
                    }
                });
                this.getLabels().each(function (p) {
                    if (!p.isAnchorLeft()) {
                        if (p.isAnchorRight()) {
                            p.setX(c.width() - (d.width() - p.oldX))
                        } else {
                            p.setX((p.position ? p.position.x : p.x) * o)
                        }
                    }
                    if (!p.isAnchorTop()) {
                        if (p.isAnchorBottom()) {
                            p.setY(c.height() - (d.height() - p.oldY))
                        } else {
                            p.setY((p.position ? p.position.y : p.y) * n)
                        }
                    }
                    if (p.position) {
                        if (!p.isOriginAnchorLeft()) {
                            if (p.isOriginAnchorRight()) {
                                p.setOriginX(c.width() - (d.width() - p.oldX))
                            } else {
                                p.setOriginX(p.x * o)
                            }
                        }
                        if (!p.isOriginAnchorTop()) {
                            if (p.isOriginAnchorBottom()) {
                                p.setOriginY(c.height() - (d.height() - p.oldY))
                            } else {
                                p.setOriginY(p.y * n)
                            }
                        }
                    }
                });
                var h = this.dockers[0];
                if (h) {
                    h.bounds.unregisterCallback(this._dockerChangedCallback);
                    if (!this._dockerUpdated) {
                        h.bounds.centerMoveTo(this.bounds.center());
                        this._dockerUpdated = false
                    }
                    h.update();
                    h.bounds.registerCallback(this._dockerChangedCallback)
                }
                this.isResized = false
            }
            this.refresh();
            this.isChanged = false;
            this._oldBounds = this.bounds.clone()
        }
        this.children.each(function (p) {
            if (!(p instanceof ORYX.Core.Controls.Docker)) {
                p._update()
            }
        });
        if (this.dockers.length > 0 && !this.dockers.first().getDockedShape()) {
            this.dockers.each(function (p) {
                p.bounds.centerMoveTo(this.bounds.center())
            }.bind(this))
        }
    }, refresh: function () {
        arguments.callee.$.refresh.apply(this, arguments);
        var a = this.bounds.upperLeft().x;
        var b = this.bounds.upperLeft().y;
        this.node.firstChild.setAttributeNS(null, "transform", "translate(" + a + ", " + b + ")");
        this.node.childNodes[1].childNodes[1].setAttributeNS(null, "transform", "translate(" + a + ", " + b + ")");
        this._svgShapes.each(function (c) {
            c.update()
        })
    }, _dockerChanged: function () {
        var a = this.dockers[0];
        this.bounds.centerMoveTo(a.bounds.center());
        this._dockerUpdated = true
    }, _initSVGShapes: function (c) {
        var a = [];
        try {
            var f = new ORYX.Core.SVG.SVGShape(c);
            a.push(f)
        } catch (d) {
        }
        if (c.hasChildNodes()) {
            for (var b = 0; b < c.childNodes.length; b++) {
                a = a.concat(this._initSVGShapes(c.childNodes[b]))
            }
        }
        return a
    }, isPointIncluded: function (a, k, c) {
        var h = c && c instanceof ORYX.Core.Bounds ? c : this.absoluteBounds();
        if (!h.isIncluded(a, k)) {
            return false
        } else {
        }
        var e = h.upperLeft();
        var g = a - e.x;
        var f = k - e.y;
        var d = 0;
        do {
            var b = this._svgShapes[d++].isPointIncluded(g, f)
        } while (!b && d < this._svgShapes.length);
        return b
    }, isPointOverOffset: function (d, c) {
        var b = arguments.callee.$.isPointOverOffset.apply(this, arguments);
        if (b) {
            var a = this.absoluteBounds();
            a.widen(-ORYX.CONFIG.BORDER_OFFSET);
            if (!a.isIncluded(d, c)) {
                return true
            }
        }
        return false
    }, serialize: function () {
        var a = arguments.callee.$.serialize.apply(this);
        this.dockers.each((function (e) {
            if (e.getDockedShape()) {
                var d = e.referencePoint;
                d = d ? d : e.bounds.center();
                a.push({name: "docker", prefix: "oryx", value: $H(d).values().join(","), type: "literal"})
            }
        }).bind(this));
        try {
            var b = this.getStencil().serialize();
            if (b.type) {
                b.shape = this;
                b.data = a;
                b.result = undefined;
                b.forceExecution = true;
                this._delegateEvent(b);
                if (b.result) {
                    a = b.result
                }
            }
        } catch (c) {
        }
        return a
    }, deserialize: function (f) {
        arguments.callee.$.deserialize.apply(this, arguments);
        try {
            var a = this.getStencil().deserialize();
            if (a.type) {
                a.shape = this;
                a.data = f;
                a.result = undefined;
                a.forceExecution = true;
                this._delegateEvent(a);
                if (a.result) {
                    f = a.result
                }
            }
        } catch (g) {
        }
        var b = f.findAll(function (e) {
            return (e.prefix + "-" + e.name) == "raziel-outgoing"
        });
        b.each((function (h) {
            if (!this.parent) {
                return
            }
            var e = this.getCanvas().getChildShapeByResourceId(h.value);
            if (e) {
                if (e instanceof ORYX.Core.Edge) {
                    e.dockers.first().setDockedShape(this);
                    e.dockers.first().setReferencePoint(e.dockers.first().bounds.center())
                } else {
                    if (e.dockers.length > 0) {
                        e.dockers.first().setDockedShape(this)
                    }
                }
            }
        }).bind(this));
        if (this.dockers.length === 1) {
            var d;
            d = f.find(function (e) {
                return (e.prefix + "-" + e.name === "oryx-dockers")
            });
            if (d) {
                var c = d.value.replace(/,/g, " ").split(" ").without("").without("#");
                if (c.length === 2 && this.dockers[0].getDockedShape()) {
                    this.dockers[0].setReferencePoint({x: parseFloat(c[0]), y: parseFloat(c[1])})
                } else {
                    this.dockers[0].bounds.centerMoveTo(parseFloat(c[0]), parseFloat(c[1]))
                }
            }
        }
    }, _init: function (n) {
        arguments.callee.$._init.apply(this, arguments);
        var o = n.getElementsByTagName("g")[0];
        var r = n.ownerDocument.createAttribute("title");
        r.nodeValue = this.getStencil().title();
        o.setAttributeNode(r);
        var u = n.ownerDocument.createAttribute("id");
        u.nodeValue = this.id;
        o.setAttributeNode(u);
        var b = this.node.childNodes[0].childNodes[0];
        o = b.appendChild(o);
        this.addEventHandlers(o.parentNode);
        var t = o.getAttributeNS(ORYX.CONFIG.NAMESPACE_ORYX, "minimumSize");
        if (t) {
            t = t.replace("/,/g", " ");
            var k = t.split(" ");
            k = k.without("");
            if (k.length > 1) {
                this.minimumSize = {width: parseFloat(k[0]), height: parseFloat(k[1])}
            } else {
                this.minimumSize = {width: 1, height: 1}
            }
        }
        var g = o.getAttributeNS(ORYX.CONFIG.NAMESPACE_ORYX, "maximumSize");
        if (g) {
            g = g.replace("/,/g", " ");
            var l = g.split(" ");
            l = l.without("");
            if (l.length > 1) {
                this.maximumSize = {width: parseFloat(l[0]), height: parseFloat(l[1])}
            }
        }
        if (this.minimumSize && this.maximumSize && (this.minimumSize.width > this.maximumSize.width || this.minimumSize.height > this.maximumSize.height)) {
            throw this + ": Minimum Size must be greater than maxiumSize."
        }
        this._svgShapes = this._initSVGShapes(o);
        var a = {x: undefined, y: undefined};
        var d = {x: undefined, y: undefined};
        var y = this;
        this._svgShapes.each(function (z) {
            a.x = (a.x !== undefined) ? Math.min(a.x, z.x) : z.x;
            a.y = (a.y !== undefined) ? Math.min(a.y, z.y) : z.y;
            d.x = (d.x !== undefined) ? Math.max(d.x, z.x + z.width) : z.x + z.width;
            d.y = (d.y !== undefined) ? Math.max(d.y, z.y + z.height) : z.y + z.height;
            if (z.isHorizontallyResizable) {
                y.isHorizontallyResizable = true;
                y.isResizable = true
            }
            if (z.isVerticallyResizable) {
                y.isVerticallyResizable = true;
                y.isResizable = true
            }
            if (z.anchorTop && z.anchorBottom) {
                y.isVerticallyResizable = true;
                y.isResizable = true
            }
            if (z.anchorLeft && z.anchorRight) {
                y.isHorizontallyResizable = true;
                y.isResizable = true
            }
        });
        this._svgShapes.each(function (z) {
            z.x -= a.x;
            z.y -= a.y;
            z.update()
        });
        var x = a.x;
        var w = a.y;
        d.x -= x;
        d.y -= w;
        a.x = 0;
        a.y = 0;
        if (d.x === 0) {
            d.x = 1
        }
        if (d.y === 0) {
            d.y = 1
        }
        this._oldBounds.set(a, d);
        this.bounds.set(a, d);
        var f = n.getElementsByTagNameNS(ORYX.CONFIG.NAMESPACE_ORYX, "magnets");
        if (f && f.length > 0) {
            f = $A(f[0].getElementsByTagNameNS(ORYX.CONFIG.NAMESPACE_ORYX, "magnet"));
            var y = this;
            f.each(function (A) {
                var E = new ORYX.Core.Controls.Magnet({eventHandlerCallback: y.eventHandlerCallback});
                var z = parseFloat(A.getAttributeNS(ORYX.CONFIG.NAMESPACE_ORYX, "cx"));
                var F = parseFloat(A.getAttributeNS(ORYX.CONFIG.NAMESPACE_ORYX, "cy"));
                E.bounds.centerMoveTo({x: z - x, y: F - w});
                var D = A.getAttributeNS(ORYX.CONFIG.NAMESPACE_ORYX, "anchors");
                if (D) {
                    D = D.replace("/,/g", " ");
                    D = D.split(" ").without("");
                    for (var B = 0; B < D.length; B++) {
                        switch (D[B].toLowerCase()) {
                            case"left":
                                E.anchorLeft = true;
                                break;
                            case"right":
                                E.anchorRight = true;
                                break;
                            case"top":
                                E.anchorTop = true;
                                break;
                            case"bottom":
                                E.anchorBottom = true;
                                break
                        }
                    }
                }
                y.add(E);
                if (!this._defaultMagnet) {
                    var C = A.getAttributeNS(ORYX.CONFIG.NAMESPACE_ORYX, "default");
                    if (C && C.toLowerCase() === "yes") {
                        y._defaultMagnet = E
                    }
                }
            })
        } else {
            var h = new ORYX.Core.Controls.Magnet();
            h.bounds.centerMoveTo(this.bounds.width() / 2, this.bounds.height() / 2);
            this.add(h)
        }
        var s = n.getElementsByTagNameNS(ORYX.CONFIG.NAMESPACE_ORYX, "docker");
        if (s && s.length > 0) {
            s = s[0];
            var q = this.createDocker();
            var e = parseFloat(s.getAttributeNS(ORYX.CONFIG.NAMESPACE_ORYX, "cx"));
            var c = parseFloat(s.getAttributeNS(ORYX.CONFIG.NAMESPACE_ORYX, "cy"));
            q.bounds.centerMoveTo({x: e - x, y: c - w});
            var p = s.getAttributeNS(ORYX.CONFIG.NAMESPACE_ORYX, "anchors");
            if (p) {
                p = p.replace("/,/g", " ");
                p = p.split(" ").without("");
                for (var v = 0; v < p.length; v++) {
                    switch (p[v].toLowerCase()) {
                        case"left":
                            q.anchorLeft = true;
                            break;
                        case"right":
                            q.anchorRight = true;
                            break;
                        case"top":
                            q.anchorTop = true;
                            break;
                        case"bottom":
                            q.anchorBottom = true;
                            break
                    }
                }
            }
        }
        var m = o.getElementsByTagNameNS(ORYX.CONFIG.NAMESPACE_SVG, "text");
        $A(m).each((function (A) {
            var z = new ORYX.Core.SVG.Label({textElement: A, shapeId: this.id});
            z.x -= x;
            z.y -= w;
            this._labels[z.id] = z;
            z.registerOnChange(this.layout.bind(this));
            if (this._stencil.id().indexOf(ORYX.CONFIG.FORM_ELEMENT_ID_PREFIX) == 0) {
                z.registerOnChange(this.fitToLabels.bind(this))
            }
        }).bind(this))
    }, fitToLabels: function () {
        var e = 0;
        this.getLabels().each(function (g) {
            var f = g.getY() + g.getHeight();
            if (f > e) {
                e = f
            }
        });
        var c = this.bounds;
        var b = false;
        if (this.minimumSize) {
            var d = this.minimumSize.height;
            if (e < d && c.height() > d && d > this.forcedHeight) {
                c.set(c.upperLeft().x, c.upperLeft().y, c.lowerRight().x, c.upperLeft().y + d);
                b = true
            } else {
                if (e > d && c.height() != e && e > this.forcedHeight) {
                    c.set(c.upperLeft().x, c.upperLeft().y, c.lowerRight().x, c.upperLeft().y + e);
                    b = true
                } else {
                    if (c.height() > this.forcedHeight && this.forcedHeight > 0) {
                        c.set(c.upperLeft().x, c.upperLeft().y, c.lowerRight().x, c.upperLeft().y + this.forcedHeight);
                        b = true
                    }
                }
            }
        }
        if (b) {
            if (this.facade.getCanvas() != null) {
                this.facade.getCanvas().update()
            }
            if (this.facade.getSelection().member(this)) {
                var a = this.facade.getSelection();
                this.facade.setSelection([]);
                this.facade.setSelection(a)
            }
        }
    }, createDocker: function () {
        var a = new ORYX.Core.Controls.Docker({eventHandlerCallback: this.eventHandlerCallback});
        a.bounds.registerCallback(this._dockerChangedCallback);
        this.dockers.push(a);
        a.parent = this;
        a.bounds.registerCallback(this._changedCallback);
        return a
    }, toString: function () {
        return this._stencil.title() + " " + this.id
    }
};
ORYX.Core.Node = ORYX.Core.Shape.extend(ORYX.Core.Node);
NAMESPACE_SVG = "http://www.w3.org/2000/svg";
NAMESPACE_ORYX = "http://www.b3mn.org/oryx";
if (!ORYX) {
    var ORYX = {}
}
if (!ORYX.Core) {
    ORYX.Core = {}
}
ORYX.Core.Edge = {
    construct: function (a, d, b) {
        arguments.callee.$.construct.apply(this, arguments);
        this.isMovable = true;
        this.isSelectable = true;
        this._dockerUpdated = false;
        this._markers = new Hash();
        this._paths = [];
        this._interactionPaths = [];
        this._dockersByPath = new Hash();
        this._markersByPath = new Hash();
        this.attachedNodePositionData = new Hash();
        var c = this.node.childNodes[0].childNodes[0];
        c = ORYX.Editor.graft("http://www.w3.org/2000/svg", c, ["g", {"pointer-events": "painted"}]);
        this.addEventHandlers(c.parentNode);
        this._oldBounds = this.bounds.clone();
        this._init(this._stencil.view());
        if (d instanceof Array) {
            this.deserialize(d)
        }
    }, _update: function (c) {
        if (this._dockerUpdated || this.isChanged || c) {
            this.dockers.invoke("update");
            if (false && (this.bounds.width() === 0 || this.bounds.height() === 0)) {
                var d = this.bounds.width();
                var q = this.bounds.height();
                this.bounds.extend({x: d === 0 ? 2 : 0, y: q === 0 ? 2 : 0});
                this.bounds.moveBy({x: d === 0 ? -1 : 0, y: q === 0 ? -1 : 0})
            }
            var e = this.bounds.upperLeft();
            var n = this._oldBounds.upperLeft();
            var f = this._oldBounds.width() === 0 ? this.bounds.width() : this._oldBounds.width();
            var p = this._oldBounds.height() === 0 ? this.bounds.height() : this._oldBounds.height();
            var m = e.x - n.x;
            var k = e.y - n.y;
            var o = (this.bounds.width() / f) || 1;
            var g = (this.bounds.height() / p) || 1;
            this.dockers.each((function (b) {
                b.bounds.unregisterCallback(this._dockerChangedCallback);
                if (!this._dockerUpdated) {
                    b.bounds.moveBy(m, k);
                    if (o !== 1 || g !== 1) {
                        var s = b.bounds.upperLeft().x - e.x;
                        var a = b.bounds.upperLeft().y - e.y;
                        b.bounds.moveTo(e.x + s * o, e.y + a * g)
                    }
                }
                b.update();
                b.bounds.registerCallback(this._dockerChangedCallback)
            }).bind(this));
            if (this._dockerUpdated) {
                var l = this.dockers.first().bounds.center();
                var h = this.dockers.first().bounds.center();
                this.dockers.each((function (b) {
                    var a = b.bounds.center();
                    l.x = Math.min(l.x, a.x);
                    l.y = Math.min(l.y, a.y);
                    h.x = Math.max(h.x, a.x);
                    h.y = Math.max(h.y, a.y)
                }).bind(this));
                this.bounds.set(Object.clone(l), Object.clone(h))
            }
            e = this.bounds.upperLeft();
            n = this._oldBounds.upperLeft();
            o = (this.bounds.width() / (f || this.bounds.width()));
            g = (this.bounds.height() / (p || this.bounds.height()));
            m = e.x - n.x;
            k = e.y - n.y;
            this.getLabels().each(function (C) {
                if (C.getReferencePoint()) {
                    var w = C.getReferencePoint();
                    var K = w.segment.from, b = w.segment.to;
                    if (!K || !K.parent || !b || !b.parent) {
                        return
                    }
                    var J = K.bounds.center(), B = b.bounds.center();
                    if (J.x === w.segment.fromPosition.x && J.y === w.segment.fromPosition.y && B.x === w.segment.toPosition.x && B.y === w.segment.toPosition.y && !w.dirty) {
                        return
                    }
                    if (!this.parent.initializingShapes) {
                        var L = ORYX.Core.Math.getDistanceBetweenTwoPoints(w.segment.fromPosition, w.segment.toPosition, w.intersection);
                        var M = ORYX.Core.Math.getPointBetweenTwoPoints(J, B, isNaN(L) ? 0.5 : L);
                        var I = ORYX.Core.Math.getOrthogonalIdentityVector(J, B);
                        var a = Math.abs(I.y) === 1, F = Math.abs(I.x) === 1;
                        I.x *= w.distance;
                        I.y *= w.distance;
                        I.x += M.x;
                        I.y += M.y;
                        var H = a && w.orientation && (w.iorientation || w.orientation).endsWith("r") ? -C.getWidth() : 0;
                        var G = F && w.orientation && (w.iorientation || w.orientation).startsWith("l") ? -C.getHeight() + 2 : 0;
                        C.setX(I.x + H);
                        C.setY(I.y + G);
                        this.updateReferencePointOfLabel(C, M, K, b)
                    } else {
                        var I = ORYX.Core.Math.getOrthogonalIdentityVector(J, B);
                        I.x *= w.distance;
                        I.y *= w.distance;
                        I.x += w.intersection.x;
                        I.y += w.intersection.y;
                        C.setX(I.x);
                        C.setY(I.y);
                        w.segment.fromPosition = J;
                        w.segment.toPosition = B
                    }
                    return
                }
                if (C.position && !this.parent.initializingShapes) {
                    var E = C.position.x + (m * (o || 1));
                    if (E > this.bounds.lowerRight().x) {
                        E += this.bounds.width() - (this.bounds.width() / (o || 1))
                    }
                    var D = C.position.y + (k * (g || 1));
                    if (D > this.bounds.lowerRight().y) {
                        D += this.bounds.height() - (this.bounds.height() / (g || 1))
                    }
                    C.setX(E);
                    C.setY(D);
                    return
                }
                switch (C.getEdgePosition()) {
                    case"starttop":
                        var N = this._getAngle(this.dockers[0], this.dockers[1]);
                        var z = this.dockers.first().bounds.center();
                        if (N <= 90 || N > 270) {
                            C.horizontalAlign("left");
                            C.verticalAlign("bottom");
                            C.x = z.x + C.getOffsetTop();
                            C.y = z.y - C.getOffsetTop();
                            C.rotate(360 - N, z)
                        } else {
                            C.horizontalAlign("right");
                            C.verticalAlign("bottom");
                            C.x = z.x - C.getOffsetTop();
                            C.y = z.y - C.getOffsetTop();
                            C.rotate(180 - N, z)
                        }
                        break;
                    case"startmiddle":
                        var N = this._getAngle(this.dockers[0], this.dockers[1]);
                        var z = this.dockers.first().bounds.center();
                        if (N <= 90 || N > 270) {
                            C.horizontalAlign("left");
                            C.verticalAlign("bottom");
                            C.x = z.x + 2;
                            C.y = z.y + 4;
                            C.rotate(360 - N, z)
                        } else {
                            C.horizontalAlign("right");
                            C.verticalAlign("bottom");
                            C.x = z.x + 1;
                            C.y = z.y + 4;
                            C.rotate(180 - N, z)
                        }
                        break;
                    case"startbottom":
                        var N = this._getAngle(this.dockers[0], this.dockers[1]);
                        var z = this.dockers.first().bounds.center();
                        if (N <= 90 || N > 270) {
                            C.horizontalAlign("left");
                            C.verticalAlign("top");
                            C.x = z.x + C.getOffsetBottom();
                            C.y = z.y + C.getOffsetBottom();
                            C.rotate(360 - N, z)
                        } else {
                            C.horizontalAlign("right");
                            C.verticalAlign("top");
                            C.x = z.x - C.getOffsetBottom();
                            C.y = z.y + C.getOffsetBottom();
                            C.rotate(180 - N, z)
                        }
                        break;
                    case"midtop":
                        var v = this.dockers.length;
                        if (v % 2 == 0) {
                            var N = this._getAngle(this.dockers[v / 2 - 1], this.dockers[v / 2]);
                            var u = this.dockers[v / 2 - 1].bounds.center();
                            var s = this.dockers[v / 2].bounds.center();
                            var z = {x: (u.x + s.x) / 2, y: (u.y + s.y) / 2};
                            C.horizontalAlign("center");
                            C.verticalAlign("bottom");
                            C.x = z.x;
                            C.y = z.y - C.getOffsetTop();
                            if (N <= 90 || N > 270) {
                                C.rotate(360 - N, z)
                            } else {
                                C.rotate(180 - N, z)
                            }
                        } else {
                            var A = parseInt(v / 2);
                            var N = this._getAngle(this.dockers[A], this.dockers[A + 1]);
                            var z = this.dockers[A].bounds.center();
                            if (N <= 90 || N > 270) {
                                C.horizontalAlign("left");
                                C.verticalAlign("bottom");
                                C.x = z.x + C.getOffsetTop();
                                C.y = z.y - C.getOffsetTop();
                                C.rotate(360 - N, z)
                            } else {
                                C.horizontalAlign("right");
                                C.verticalAlign("bottom");
                                C.x = z.x - C.getOffsetTop();
                                C.y = z.y - C.getOffsetTop();
                                C.rotate(180 - N, z)
                            }
                        }
                        break;
                    case"midbottom":
                        var v = this.dockers.length;
                        if (v % 2 == 0) {
                            var N = this._getAngle(this.dockers[v / 2 - 1], this.dockers[v / 2]);
                            var u = this.dockers[v / 2 - 1].bounds.center();
                            var s = this.dockers[v / 2].bounds.center();
                            var z = {x: (u.x + s.x) / 2, y: (u.y + s.y) / 2};
                            C.horizontalAlign("center");
                            C.verticalAlign("top");
                            C.x = z.x;
                            C.y = z.y + C.getOffsetTop();
                            if (N <= 90 || N > 270) {
                                C.rotate(360 - N, z)
                            } else {
                                C.rotate(180 - N, z)
                            }
                        } else {
                            var A = parseInt(v / 2);
                            var N = this._getAngle(this.dockers[A], this.dockers[A + 1]);
                            var z = this.dockers[A].bounds.center();
                            if (N <= 90 || N > 270) {
                                C.horizontalAlign("left");
                                C.verticalAlign("top");
                                C.x = z.x + C.getOffsetBottom();
                                C.y = z.y + C.getOffsetBottom();
                                C.rotate(360 - N, z)
                            } else {
                                C.horizontalAlign("right");
                                C.verticalAlign("top");
                                C.x = z.x - C.getOffsetBottom();
                                C.y = z.y + C.getOffsetBottom();
                                C.rotate(180 - N, z)
                            }
                        }
                        break;
                    case"endtop":
                        var t = this.dockers.length;
                        var N = this._getAngle(this.dockers[t - 2], this.dockers[t - 1]);
                        var z = this.dockers.last().bounds.center();
                        if (N <= 90 || N > 270) {
                            C.horizontalAlign("right");
                            C.verticalAlign("bottom");
                            C.x = z.x - C.getOffsetTop();
                            C.y = z.y - C.getOffsetTop();
                            C.rotate(360 - N, z)
                        } else {
                            C.horizontalAlign("left");
                            C.verticalAlign("bottom");
                            C.x = z.x + C.getOffsetTop();
                            C.y = z.y - C.getOffsetTop();
                            C.rotate(180 - N, z)
                        }
                        break;
                    case"endbottom":
                        var t = this.dockers.length;
                        var N = this._getAngle(this.dockers[t - 2], this.dockers[t - 1]);
                        var z = this.dockers.last().bounds.center();
                        if (N <= 90 || N > 270) {
                            C.horizontalAlign("right");
                            C.verticalAlign("top");
                            C.x = z.x - C.getOffsetBottom();
                            C.y = z.y + C.getOffsetBottom();
                            C.rotate(360 - N, z)
                        } else {
                            C.horizontalAlign("left");
                            C.verticalAlign("top");
                            C.x = z.x + C.getOffsetBottom();
                            C.y = z.y + C.getOffsetBottom();
                            C.rotate(180 - N, z)
                        }
                        break
                }
            }.bind(this));
            this.children.each(function (a) {
                if (a instanceof ORYX.Core.Node) {
                    this.calculatePositionOfAttachedChildNode.call(this, a)
                }
            }.bind(this));
            this.refreshAttachedNodes();
            this.refresh();
            this.isChanged = false;
            this._dockerUpdated = false;
            this._oldBounds = this.bounds.clone()
        }
        var r = navigator.userAgent;
        if (navigator.appVersion.indexOf("MSIE 10") !== -1 || (r.indexOf("Trident") !== -1 && r.indexOf("rv:11") !== -1)) {
            this.node.parentNode.insertBefore(this.node, this.node)
        }
    }, movePointToUpperLeftOfNode: function (a, b) {
        a.x -= b.width() / 2;
        a.y -= b.height() / 2
    }, refreshAttachedNodes: function () {
        this.attachedNodePositionData.values().each(function (a) {
            var d = a.segment.docker1.bounds.center();
            var b = a.segment.docker2.bounds.center();
            this.relativizePoint(d);
            this.relativizePoint(b);
            var c = new Object();
            c.x = d.x + a.relativDistanceFromDocker1 * (b.x - d.x);
            c.y = d.y + a.relativDistanceFromDocker1 * (b.y - d.y);
            this.movePointToUpperLeftOfNode(c, a.node.bounds);
            a.node.bounds.moveTo(c);
            a.node._update()
        }.bind(this))
    }, calculatePositionOfAttachedChildNode: function (b) {
        var a = new Object();
        a.x = 0;
        a.y = 0;
        if (!this.attachedNodePositionData[b.getId()]) {
            this.attachedNodePositionData[b.getId()] = new Object();
            this.attachedNodePositionData[b.getId()].relativDistanceFromDocker1 = 0;
            this.attachedNodePositionData[b.getId()].node = b;
            this.attachedNodePositionData[b.getId()].segment = new Object();
            this.findEdgeSegmentForNode(b)
        } else {
            if (b.isChanged) {
                this.findEdgeSegmentForNode(b)
            }
        }
    }, findEdgeSegmentForNode: function (c) {
        var b = this.dockers.length;
        var a = undefined;
        for (i = 1; i < b; i++) {
            var g = this.dockers[i - 1].bounds.center();
            var e = this.dockers[i].bounds.center();
            this.relativizePoint(g);
            this.relativizePoint(e);
            var d = c.bounds.center();
            var f = ORYX.Core.Math.distancePointLinie(g, e, d, true);
            if ((f || f == 0) && ((!a && a != 0) || f < a)) {
                a = f;
                this.attachedNodePositionData[c.getId()].segment.docker1 = this.dockers[i - 1];
                this.attachedNodePositionData[c.getId()].segment.docker2 = this.dockers[i]
            }
            if (!f && !a && a != 0) {
                (ORYX.Core.Math.getDistancePointToPoint(d, g) < ORYX.Core.Math.getDistancePointToPoint(d, e)) ? this.attachedNodePositionData[c.getId()].relativDistanceFromDocker1 = 0 : this.attachedNodePositionData[c.getId()].relativDistanceFromDocker1 = 1;
                this.attachedNodePositionData[c.getId()].segment.docker1 = this.dockers[i - 1];
                this.attachedNodePositionData[c.getId()].segment.docker2 = this.dockers[i]
            }
        }
        if (a || a == 0) {
            this.attachedNodePositionData[c.getId()].relativDistanceFromDocker1 = this.getLineParameterForPosition(this.attachedNodePositionData[c.getId()].segment.docker1, this.attachedNodePositionData[c.getId()].segment.docker2, c)
        }
    }, findSegment: function (c) {
        var b = this.dockers.length;
        var a;
        var d = c instanceof ORYX.Core.UIObject ? c.bounds.center() : c;
        for (i = 1; i < b; i++) {
            var g = this.dockers[i - 1].bounds.center();
            var e = this.dockers[i].bounds.center();
            var f = ORYX.Core.Math.distancePointLinie(g, e, d, true);
            if (typeof f == "number" && (a === undefined || f < a.distance)) {
                a = {distance: f, fromDocker: this.dockers[i - 1], toDocker: this.dockers[i]}
            }
        }
        return a
    }, getLineParameterForPosition: function (b, g, d) {
        var f = b.bounds.center();
        var e = g.bounds.center();
        this.relativizePoint(f);
        this.relativizePoint(e);
        var c = ORYX.Core.Math.getPointOfIntersectionPointLine(f, e, d.bounds.center(), true);
        if (!c) {
            return 0
        }
        var a = ORYX.Core.Math.getDistancePointToPoint(c, f) / ORYX.Core.Math.getDistancePointToPoint(f, e);
        return a
    }, relativizePoint: function (a) {
        a.x -= this.bounds.upperLeft().x;
        a.y -= this.bounds.upperLeft().y
    }, optimizedUpdate: function () {
        var a = function (b) {
            if (!b._dockedShape || !b._dockedShapeBounds) {
                return
            }
            var c = {
                x: b._dockedShape.bounds.a.x - b._dockedShapeBounds.a.x,
                y: b._dockedShape.bounds.a.y - b._dockedShapeBounds.a.y
            };
            b.bounds.moveBy(c);
            b._dockedShapeBounds.moveBy(c)
        };
        a(this.dockers.first());
        a(this.dockers.last());
        this.refresh()
    }, refresh: function () {
        arguments.callee.$.refresh.apply(this, arguments);
        var b;
        this._paths.each((function (h, f) {
            var e = this._dockersByPath[h.id];
            var l = undefined;
            var k = undefined;
            if (b) {
                k = "M" + b.x + " " + b.y
            } else {
                l = e[0].bounds.center();
                b = l;
                k = "M" + l.x + " " + l.y
            }
            for (var g = 1; g < e.length; g++) {
                l = e[g].bounds.center();
                k = k + "L" + l.x + " " + l.y + " ";
                b = l
            }
            h.setAttributeNS(null, "d", k);
            this._interactionPaths[f].setAttributeNS(null, "d", k)
        }).bind(this));
        if (this.getChildNodes().length > 0) {
            var a = this.bounds.upperLeft().x;
            var c = this.bounds.upperLeft().y;
            this.node.firstChild.childNodes[1].setAttributeNS(null, "transform", "translate(" + a + ", " + c + ")")
        }
    }, getIntersectionPoint: function () {
        var a = Math.floor(this.dockers.length / 2);
        return ORYX.Core.Math.midPoint(this.dockers[a - 1].bounds.center(), this.dockers[a].bounds.center())
    }, isBoundsIncluded: function (c) {
        var a = this.dockers, b = a.length;
        return a.any(function (g, f) {
            if (f == b - 1) {
                return false
            }
            var e = g.bounds.center();
            var d = a[f + 1].bounds.center();
            return ORYX.Core.Math.isRectOverLine(e.x, e.y, d.x, d.y, c.a.x, c.a.y, c.b.x, c.b.y)
        })
    }, isPointIncluded: function (g, f) {
        var a = this.absoluteBounds().isIncluded(g, f, ORYX.CONFIG.OFFSET_EDGE_BOUNDS);
        var e = undefined;
        if (a && this.dockers.length > 0) {
            var c = 0;
            var d, b;
            do {
                d = this.dockers[c].bounds.center();
                b = this.dockers[++c].bounds.center();
                e = ORYX.Core.Math.isPointInLine(g, f, d.x, d.y, b.x, b.y, ORYX.CONFIG.OFFSET_EDGE_BOUNDS)
            } while (!e && c < this.dockers.length - 1)
        }
        return e
    }, isPointOverOffset: function () {
        return false
    }, containsNode: function (a) {
        if (this._paths.include(a) || this._interactionPaths.include(a)) {
            return true
        }
        return false
    }, _getAngle: function (a, d) {
        var c = a instanceof ORYX.Core.Controls.Docker ? a.absoluteCenterXY() : a;
        var b = d instanceof ORYX.Core.Controls.Docker ? d.absoluteCenterXY() : d;
        return ORYX.Core.Math.getAngle(c, b)
    }, alignDockers: function () {
        this._update(true);
        var e = this.dockers.first().bounds.center();
        var d = this.dockers.last().bounds.center();
        var c = d.x - e.x;
        var a = d.y - e.y;
        var b = this.dockers.length - 1;
        this.dockers.each((function (h, g) {
            var f = g / b;
            h.bounds.unregisterCallback(this._dockerChangedCallback);
            h.bounds.moveTo(e.x + f * c, e.y + f * a);
            h.bounds.registerCallback(this._dockerChangedCallback)
        }).bind(this));
        this._dockerChanged()
    }, add: function (a) {
        arguments.callee.$.add.apply(this, arguments);
        if (a instanceof ORYX.Core.Controls.Docker && this.dockers.include(a)) {
            var b = this._dockersByPath.values()[0];
            if (b) {
                b.splice(this.dockers.indexOf(a), 0, a)
            }
            this.handleChildShapesAfterAddDocker(a)
        }
    }, handleChildShapesAfterAddDocker: function (f) {
        if (!f instanceof ORYX.Core.Controls.Docker) {
            return undefined
        }
        var d = this.dockers.indexOf(f);
        if (!(0 < d && d < this.dockers.length - 1)) {
            return undefined
        }
        var e = this.dockers[d - 1];
        var b = this.dockers[d + 1];
        var c = this.getAttachedNodePositionDataForSegment(e, b);
        var a = ORYX.Core.Math.getDistancePointToPoint(e.bounds.center(), f.bounds.center());
        var h = ORYX.Core.Math.getDistancePointToPoint(b.bounds.center(), f.bounds.center());
        if (!(a + h)) {
            return
        }
        var g = a / (a + h);
        c.each(function (m) {
            if (m.value.relativDistanceFromDocker1 < g) {
                m.value.segment.docker2 = f;
                m.value.relativDistanceFromDocker1 = m.value.relativDistanceFromDocker1 / g
            } else {
                m.value.segment.docker1 = f;
                var l = 1 - g;
                var k = m.value.relativDistanceFromDocker1 - g;
                m.value.relativDistanceFromDocker1 = k / l
            }
        });
        this.getLabels().each(function (m) {
            var o = m.getReferencePoint();
            if (!o) {
                return
            }
            var l = this.dockers.indexOf(f);
            if (l >= o.segment.fromIndex && l <= o.segment.toIndex) {
                var n = this.findSegment(o.intersection);
                if (!n) {
                    n.fromDocker = o.segment.fromIndex >= (this.dockers.length / 2) ? this.dockers[0] : this.dockers[this.dockers.length - 2];
                    n.toDocker = this.dockers[this.dockers.indexOf(from) + 1]
                }
                var k = n.fromDocker.bounds.center(), p = n.toDocker.bounds.center();
                var q = ORYX.Core.Math.getPointOfIntersectionPointLine(k, p, o.intersection, true);
                this.updateReferencePointOfLabel(m, q, n.fromDocker, n.toDocker, true)
            }
        }.bind(this));
        this.refreshAttachedNodes()
    }, getAttachedNodePositionDataForSegment: function (c, a) {
        if (!((c instanceof ORYX.Core.Controls.Docker) && (a instanceof ORYX.Core.Controls.Docker))) {
            return []
        }
        var b = this.attachedNodePositionData.findAll(function (d) {
            return d.value.segment.docker1 === c && d.value.segment.docker2 === a
        });
        if (!b) {
            return []
        }
        return b
    }, remove: function (a) {
        arguments.callee.$.remove.apply(this, arguments);
        if (this.attachedNodePositionData[a.getId()]) {
            delete this.attachedNodePositionData[a.getId()]
        }
        if (a instanceof ORYX.Core.Controls.Docker) {
            this.handleChildShapesAfterRemoveDocker(a)
        }
    }, updateReferencePointOfLabel: function (a, g, f, e, b) {
        if (!a.getReferencePoint() || !a.isVisible) {
            return
        }
        var c = a.getReferencePoint();
        if (c.orientation && c.orientation !== "ce") {
            var d = this._getAngle(f, e);
            if (c.distance >= 0) {
                if (d == 0) {
                    a.horizontalAlign("left");
                    a.verticalAlign("bottom")
                } else {
                    if (d > 0 && d < 90) {
                        a.horizontalAlign("right");
                        a.verticalAlign("bottom")
                    } else {
                        if (d == 90) {
                            a.horizontalAlign("right");
                            a.verticalAlign("top")
                        } else {
                            if (d > 90 && d < 180) {
                                a.horizontalAlign("right");
                                a.verticalAlign("top")
                            } else {
                                if (d == 180) {
                                    a.horizontalAlign("left");
                                    a.verticalAlign("top")
                                } else {
                                    if (d > 180 && d < 270) {
                                        a.horizontalAlign("left");
                                        a.verticalAlign("top")
                                    } else {
                                        if (d == 270) {
                                            a.horizontalAlign("left");
                                            a.verticalAlign("top")
                                        } else {
                                            if (d > 270 && d <= 360) {
                                                a.horizontalAlign("left");
                                                a.verticalAlign("bottom")
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            } else {
                if (d == 0) {
                    a.horizontalAlign("left");
                    a.verticalAlign("top")
                } else {
                    if (d > 0 && d < 90) {
                        a.horizontalAlign("left");
                        a.verticalAlign("top")
                    } else {
                        if (d == 90) {
                            a.horizontalAlign("left");
                            a.verticalAlign("top")
                        } else {
                            if (d > 90 && d < 180) {
                                a.horizontalAlign("left");
                                a.verticalAlign("bottom")
                            } else {
                                if (d == 180) {
                                    a.horizontalAlign("left");
                                    a.verticalAlign("bottom")
                                } else {
                                    if (d > 180 && d < 270) {
                                        a.horizontalAlign("right");
                                        a.verticalAlign("bottom")
                                    } else {
                                        if (d == 270) {
                                            a.horizontalAlign("right");
                                            a.verticalAlign("top")
                                        } else {
                                            if (d > 270 && d <= 360) {
                                                a.horizontalAlign("right");
                                                a.verticalAlign("top")
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
            c.iorientation = c.iorientation || c.orientation;
            c.orientation = (a.verticalAlign() == "top" ? "u" : "l") + (a.horizontalAlign() == "left" ? "l" : "r")
        }
        a.setReferencePoint(jQuery.extend({}, {
            intersection: g,
            segment: {
                from: f,
                fromIndex: this.dockers.indexOf(f),
                fromPosition: f.bounds.center(),
                to: e,
                toIndex: this.dockers.indexOf(e),
                toPosition: e.bounds.center()
            },
            dirty: b || false
        }, c))
    }, handleChildShapesAfterRemoveDocker: function (a) {
        if (!(a instanceof ORYX.Core.Controls.Docker)) {
            return
        }
        this.attachedNodePositionData.each(function (c) {
            if (c.value.segment.docker1 === a) {
                var b = this.dockers.indexOf(c.value.segment.docker2);
                if (b == -1) {
                    return
                }
                c.value.segment.docker1 = this.dockers[b - 1]
            } else {
                if (c.value.segment.docker2 === a) {
                    var b = this.dockers.indexOf(c.value.segment.docker1);
                    if (b == -1) {
                        return
                    }
                    c.value.segment.docker2 = this.dockers[b + 1]
                }
            }
        }.bind(this));
        this.getLabels().each(function (b) {
            var d = b.getReferencePoint();
            if (!d) {
                return
            }
            var g = d.segment.from;
            var f = d.segment.to;
            if (g !== a && f !== a) {
                return
            }
            var c = this.findSegment(d.intersection);
            if (!c) {
                g = c.fromDocker;
                f = c.toDocker
            } else {
                g = g === a ? this.dockers[this.dockers.indexOf(f) - 1] : g;
                f = this.dockers[this.dockers.indexOf(g) + 1]
            }
            var e = ORYX.Core.Math.getPointOfIntersectionPointLine(g.bounds.center(), f.bounds.center(), d.intersection, true);
            this.updateReferencePointOfLabel(b, e, g, f, true)
        }.bind(this));
        this.refreshAttachedNodes()
    }, addDocker: function (b, d) {
        var c;
        var a;
        this._dockersByPath.any((function (e) {
            return e.value.any((function (h, l) {
                if (!c) {
                    c = h;
                    return false
                } else {
                    var n = c.bounds.center();
                    var m = h.bounds.center();
                    var f = 1;
                    if (!isNaN(screen.logicalXDPI) && !isNaN(screen.systemXDPI)) {
                        var g = navigator.userAgent;
                        if (g.indexOf("MSIE") >= 0) {
                            var p = Math.round((screen.deviceXDPI / screen.logicalXDPI) * 100);
                            if (p !== 100) {
                                f = p / 100
                            }
                        }
                    }
                    if (f !== 1) {
                        b.x = b.x / f;
                        b.y = b.y / f
                    }
                    if (ORYX.Core.Math.isPointInLine(b.x, b.y, n.x, n.y, m.x, m.y, 10)) {
                        var q = this._paths.find(function (r) {
                            return r.id === e.key
                        });
                        if (q) {
                            var o = q.getAttributeNS(NAMESPACE_ORYX, "allowDockers");
                            if (o && o.toLowerCase() === "no") {
                                return true
                            }
                        }
                        var k = (d) ? d : this.createDocker(this.dockers.indexOf(c) + 1, b);
                        k.bounds.centerMoveTo(b);
                        if (d) {
                            this.add(k, this.dockers.indexOf(c) + 1)
                        }
                        a = k;
                        return true
                    } else {
                        c = h;
                        return false
                    }
                }
            }).bind(this))
        }).bind(this));
        return a
    }, removeDocker: function (a) {
        if (this.dockers.length > 2 && !(this.dockers.first() === a)) {
            this._dockersByPath.any((function (b) {
                if (b.value.member(a)) {
                    if (a === b.value.last()) {
                        return true
                    } else {
                        this.remove(a);
                        this._dockersByPath[b.key] = b.value.without(a);
                        this.isChanged = true;
                        this._dockerChanged();
                        return true
                    }
                }
                return false
            }).bind(this))
        }
    }, removeUnusedDockers: function () {
        var a = $H({});
        this.dockers.each(function (e, b) {
            if (b == 0 || b == this.dockers.length - 1) {
                return
            }
            var d = this.dockers[b - 1];
            if (a.values().indexOf(d) != -1 && this.dockers[b - 2]) {
                d = this.dockers[b - 2]
            }
            var c = this.dockers[b + 1];
            var f = d.getDockedShape() && d.referencePoint ? d.getAbsoluteReferencePoint() : d.bounds.center();
            var h = c.getDockedShape() && c.referencePoint ? c.getAbsoluteReferencePoint() : c.bounds.center();
            var g = e.bounds.center();
            if (ORYX.Core.Math.isPointInLine(g.x, g.y, f.x, f.y, h.x, h.y, 1)) {
                a[b] = e
            }
        }.bind(this));
        a.each(function (b) {
            this.removeDocker(b.value)
        }.bind(this));
        if (a.values().length > 0) {
            this._update(true)
        }
        return a
    }, _init: function (f) {
        arguments.callee.$._init.apply(this, arguments);
        var e, c, s, q;
        var k = f.getElementsByTagNameNS(NAMESPACE_SVG, "defs");
        if (k.length > 0) {
            k = k[0];
            var d = $A(k.getElementsByTagNameNS(NAMESPACE_SVG, "marker"));
            var l;
            var o = this;
            d.each(function (t) {
                try {
                    l = new ORYX.Core.SVG.SVGMarker(t.cloneNode(true));
                    o._markers[l.id] = l;
                    var u = $A(l.element.getElementsByTagNameNS(NAMESPACE_SVG, "text"));
                    var g;
                    u.each(function (w) {
                        g = new ORYX.Core.SVG.Label({textElement: w, shapeId: this.id});
                        o._labels[g.id] = g
                    })
                } catch (v) {
                }
            })
        }
        var b = f.getElementsByTagNameNS(NAMESPACE_SVG, "g");
        if (b.length <= 0) {
            throw"Edge: No g element found."
        }
        var m = b[0];
        m.setAttributeNS(null, "id", null);
        var h = true;
        $A(m.childNodes).each((function (G, A) {
            if (ORYX.Editor.checkClassType(G, SVGPathElement)) {
                G = G.cloneNode(false);
                var z = this.id + "_" + A;
                G.setAttributeNS(null, "id", z);
                this._paths.push(G);
                var C = [];
                var H = G.getAttributeNS(null, "marker-start");
                if (H && H !== "") {
                    H = H.strip();
                    H = H.replace(/^url\(#/, "");
                    var w = this.getValidMarkerId(H);
                    G.setAttributeNS(null, "marker-start", "url(#" + w + ")");
                    C.push(this._markers[w])
                }
                H = G.getAttributeNS(null, "marker-mid");
                if (H && H !== "") {
                    H = H.strip();
                    H = H.replace(/^url\(#/, "");
                    var t = this.getValidMarkerId(H);
                    G.setAttributeNS(null, "marker-mid", "url(#" + t + ")");
                    C.push(this._markers[t])
                }
                H = G.getAttributeNS(null, "marker-end");
                if (H && H !== "") {
                    H = H.strip();
                    var B = this.getValidMarkerId(H);
                    G.setAttributeNS(null, "marker-end", "url(#" + B + ")");
                    C.push(this._markers[B])
                }
                this._markersByPath[z] = C;
                var g = new PathParser();
                var F = new ORYX.Core.SVG.PointsPathHandler();
                g.setHandler(F);
                g.parsePath(G);
                if (F.points.length < 4) {
                    throw"Edge: Path has to have two or more points specified."
                }
                this._dockersByPath[z] = [];
                for (var v = 0; v < F.points.length; v += 2) {
                    var E = F.points[v];
                    var D = F.points[v + 1];
                    if (h || v > 0) {
                        var u = new ORYX.Core.Controls.Docker({eventHandlerCallback: this.eventHandlerCallback});
                        u.bounds.centerMoveTo(E, D);
                        u.bounds.registerCallback(this._dockerChangedCallback);
                        this.add(u, this.dockers.length);
                        if (e) {
                            e = Math.min(E, e);
                            c = Math.min(D, c)
                        } else {
                            e = E;
                            c = D
                        }
                        if (s) {
                            s = Math.max(E, s);
                            q = Math.max(D, q)
                        } else {
                            s = E;
                            q = D
                        }
                    }
                }
                h = false
            }
        }).bind(this));
        this.bounds.set(e, c, s, q);
        if (false && (this.bounds.width() === 0 || this.bounds.height() === 0)) {
            var a = this.bounds.width();
            var p = this.bounds.height();
            this.bounds.extend({x: a === 0 ? 2 : 0, y: p === 0 ? 2 : 0});
            this.bounds.moveBy({x: a === 0 ? -1 : 0, y: p === 0 ? -1 : 0})
        }
        this._oldBounds = this.bounds.clone();
        this._paths.reverse();
        var r = [];
        this._paths.each((function (g) {
            r.push(this.node.childNodes[0].childNodes[0].childNodes[0].appendChild(g))
        }).bind(this));
        this._paths = r;
        this._paths.each((function (t) {
            var g = t.cloneNode(false);
            g.setAttributeNS(null, "id", undefined);
            g.setAttributeNS(null, "stroke-width", 10);
            g.setAttributeNS(null, "visibility", "hidden");
            g.setAttributeNS(null, "stroke-dasharray", null);
            g.setAttributeNS(null, "stroke", "black");
            g.setAttributeNS(null, "fill", "none");
            g.setAttributeNS(null, "title", this.getStencil().title());
            this._interactionPaths.push(this.node.childNodes[0].childNodes[0].childNodes[0].appendChild(g))
        }).bind(this));
        this._paths.reverse();
        this._interactionPaths.reverse();
        var n = f.getElementsByTagNameNS(ORYX.CONFIG.NAMESPACE_SVG, "text");
        $A(n).each((function (t) {
            var g = new ORYX.Core.SVG.Label({textElement: t, shapeId: this.id});
            this.node.childNodes[0].childNodes[0].appendChild(g.node);
            this._labels[g.id] = g;
            g.registerOnChange(this.layout.bind(this))
        }).bind(this));
        this.propertiesChanged.each(function (g) {
            g.value = true
        })
    }, getValidMarkerId: function (b) {
        if (b.indexOf('url("#') >= 0) {
            var a = b.replace(/^url\(\"#/, "").replace(/\"\)$/, "");
            return this.id + a
        } else {
            b = b.replace(/^url\(#/, "");
            return this.id.concat(b.replace(/\)$/, ""))
        }
    }, addMarkers: function (a) {
        this._markers.each(function (b) {
            if (!a.ownerDocument.getElementById(b.value.id)) {
                b.value.element = a.appendChild(b.value.element)
            }
        })
    }, removeMarkers: function () {
        var b = this.node.ownerSVGElement;
        if (b) {
            var a = b.getElementsByTagNameNS(NAMESPACE_SVG, "defs");
            if (a.length > 0) {
                a = a[0];
                this._markers.each(function (c) {
                    var d = a.ownerDocument.getElementById(c.value.id);
                    if (d) {
                        c.value.element = a.removeChild(c.value.element)
                    }
                })
            }
        }
    }, _dockerChanged: function () {
        this._dockerUpdated = true
    }, serialize: function () {
        var a = arguments.callee.$.serialize.apply(this);
        var d = "";
        this._dockersByPath.each((function (e) {
            e.value.each(function (k) {
                var h = k.getDockedShape() && k.referencePoint ? k.referencePoint : k.bounds.center();
                d = d.concat(h.x + " " + h.y + " ")
            });
            d += " # "
        }).bind(this));
        a.push({name: "dockers", prefix: "oryx", value: d, type: "literal"});
        var b = this.dockers.last();
        var g = b.getDockedShape();
        if (g) {
            a.push({name: "target", prefix: "raziel", value: "#" + ERDF.__stripHashes(g.resourceId), type: "resource"})
        }
        try {
            var c = this.getStencil().serialize();
            if (c.type) {
                c.shape = this;
                c.data = a;
                c.result = undefined;
                c.forceExecution = true;
                this._delegateEvent(c);
                if (c.result) {
                    a = c.result
                }
            }
        } catch (f) {
        }
        return a
    }, deserialize: function (f) {
        try {
            var c = this.getStencil().deserialize();
            if (c.type) {
                c.shape = this;
                c.data = f;
                c.result = undefined;
                c.forceExecution = true;
                this._delegateEvent(c);
                if (c.result) {
                    f = c.result
                }
            }
        } catch (h) {
        }
        var g = f.find(function (e) {
            return (e.prefix + "-" + e.name) == "raziel-target"
        });
        var a;
        if (g) {
            a = this.getCanvas().getChildShapeByResourceId(g.value)
        }
        var d = f.findAll(function (e) {
            return (e.prefix + "-" + e.name) == "raziel-outgoing"
        });
        d.each((function (l) {
            if (!this.parent) {
                return
            }
            var e = this.getCanvas().getChildShapeByResourceId(l.value);
            if (e) {
                if (e == a) {
                    this.dockers.last().setDockedShape(e);
                    this.dockers.last().setReferencePoint({x: e.bounds.width() / 2, y: e.bounds.height() / 2})
                } else {
                    if (e instanceof ORYX.Core.Edge) {
                        e.dockers.first().setDockedShape(this)
                    }
                }
            }
        }).bind(this));
        var b = f.find(function (e) {
            return (e.prefix === "oryx" && e.name === "dockers")
        });
        if (b) {
            var k = b.value.split("#").without("").without(" ");
            k.each((function (l, o) {
                var r = l.replace(/,/g, " ").split(" ").without("");
                if (r.length % 2 === 0) {
                    var s = this._paths[o];
                    if (s) {
                        if (o === 0) {
                            while (this._dockersByPath[s.id].length > 2) {
                                this.removeDocker(this._dockersByPath[s.id][1])
                            }
                        } else {
                            while (this._dockersByPath[s.id].length > 1) {
                                this.removeDocker(this._dockersByPath[s.id][0])
                            }
                        }
                        var e = this._dockersByPath[s.id];
                        if (o === 0) {
                            var q = parseFloat(r.shift());
                            var p = parseFloat(r.shift());
                            if (e.first().getDockedShape()) {
                                e.first().setReferencePoint({x: q, y: p})
                            } else {
                                e.first().bounds.centerMoveTo(q, p)
                            }
                        }
                        p = parseFloat(r.pop());
                        q = parseFloat(r.pop());
                        if (e.last().getDockedShape()) {
                            e.last().setReferencePoint({x: q, y: p})
                        } else {
                            e.last().bounds.centerMoveTo(q, p)
                        }
                        for (var m = 0; m < r.length; m++) {
                            q = parseFloat(r[m]);
                            p = parseFloat(r[++m]);
                            var n = this.createDocker();
                            n.bounds.centerMoveTo(q, p)
                        }
                    }
                }
            }).bind(this))
        } else {
            this.alignDockers()
        }
        arguments.callee.$.deserialize.apply(this, arguments);
        this._changed()
    }, toString: function () {
        return this.getStencil().title() + " " + this.id
    }, getTarget: function () {
        return this.dockers.last() ? this.dockers.last().getDockedShape() : null
    }, getSource: function () {
        return this.dockers.first() ? this.dockers.first().getDockedShape() : null
    }, isDocked: function () {
        var a = false;
        this.dockers.each(function (b) {
            if (b.isDocked()) {
                a = true;
                throw $break
            }
        });
        return a
    }, toJSON: function () {
        var a = arguments.callee.$.toJSON.apply(this, arguments);
        if (this.getTarget()) {
            a.target = {resourceId: this.getTarget().resourceId}
        }
        return a
    }
};
ORYX.Core.Edge = ORYX.Core.Shape.extend(ORYX.Core.Edge);
if (!ORYX) {
    var ORYX = {}
}
if (!ORYX.Plugins) {
    ORYX.Plugins = {}
}
ORYX.Plugins.AbstractPlugin = Clazz.extend({
    facade: null, construct: function (a) {
        this.facade = a;
        this.facade.registerOnEvent(ORYX.CONFIG.EVENT_LOADED, this.onLoaded.bind(this))
    }, onLoaded: function () {
    }, onSelectionChanged: function () {
    }, showOverlay: function (a, b, d, c) {
        if (!(a instanceof Array)) {
            a = [a]
        }
        a = a.map(function (e) {
            var f = e;
            if (typeof e == "string") {
                f = this.facade.getCanvas().getChildShapeByResourceId(e);
                f = f || this.facade.getCanvas().getChildById(e, true)
            }
            return f
        }.bind(this)).compact();
        if (!this.overlayID) {
            this.overlayID = this.type + ORYX.Editor.provideId()
        }
        this.facade.raiseEvent({
            type: ORYX.CONFIG.EVENT_OVERLAY_SHOW,
            id: this.overlayID,
            shapes: a,
            attributes: b,
            node: d,
            nodePosition: c || "NW"
        })
    }, hideOverlay: function () {
        this.facade.raiseEvent({type: ORYX.CONFIG.EVENT_OVERLAY_HIDE, id: this.overlayID})
    }, doTransform: function (d, a) {
        if (!a || !d) {
            return ""
        }
        var c = new DOMParser();
        var k = c.parseFromString(d, "text/xml");
        source = a;
        new Ajax.Request(source, {
            asynchronous: false, method: "get", onSuccess: function (m) {
                xsl = m.responseText
            }.bind(this), onFailure: (function (m) {
                ORYX.Log.error("XSL load failed" + m)
            }).bind(this)
        });
        var f = new XSLTProcessor();
        var h = new DOMParser();
        var e = h.parseFromString(xsl, "text/xml");
        f.importStylesheet(e);
        try {
            var l = f.transformToFragment(k, document);
            var b = (new XMLSerializer()).serializeToString(l);
            b = !b.startsWith("<?xml") ? '<?xml version="1.0" encoding="UTF-8"?>' + b : b;
            return b
        } catch (g) {
            return -1
        }
    }, openXMLWindow: function (a) {
        var b = window.open("data:application/xml," + encodeURIComponent(a), "_blank", "resizable=yes,width=600,height=600,toolbar=0,scrollbars=yes")
    }, openDownloadWindow: function (b, c) {
        var d = window.open("");
        if (d != null) {
            d.document.open();
            d.document.write("<html><body>");
            var a = d.document.createElement("form");
            d.document.body.appendChild(a);
            var e = function (f, g) {
                var h = document.createElement("input");
                h.name = f;
                h.type = "hidden";
                h.value = g;
                return h
            };
            a.appendChild(e("download", c));
            a.appendChild(e("file", b));
            a.method = "POST";
            d.document.write("</body></html>");
            d.document.close();
            a.action = ORYX.PATH + "/download";
            a.submit()
        }
    }, getSerializedDOM: function () {
        var a = DataManager.serializeDOM(this.facade);
        a = '<?xml version="1.0" encoding="utf-8"?><html xmlns="http://www.w3.org/1999/xhtml" xmlns:b3mn="http://b3mn.org/2007/b3mn" xmlns:ext="http://b3mn.org/2007/ext" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:atom="http://b3mn.org/2007/atom+xhtml"><head profile="http://purl.org/NET/erdf/profile"><link rel="schema.dc" href="http://purl.org/dc/elements/1.1/" /><link rel="schema.dcTerms" href="http://purl.org/dc/terms/ " /><link rel="schema.b3mn" href="http://b3mn.org" /><link rel="schema.oryx" href="http://oryx-editor.org/" /><link rel="schema.raziel" href="http://raziel.org/" /><base href="' + location.href.split("?")[0] + '" /></head><body>' + a + "</body></html>";
        return a
    }, enableReadOnlyMode: function () {
        this.facade.disableEvent(ORYX.CONFIG.EVENT_MOUSEDOWN);
        this._stopSelectionChange = function () {
            if (this.facade.getSelection().length > 0) {
                this.facade.setSelection([])
            }
        };
        this.facade.registerOnEvent(ORYX.CONFIG.EVENT_SELECTION_CHANGED, this._stopSelectionChange.bind(this))
    }, disableReadOnlyMode: function () {
        this.facade.enableEvent(ORYX.CONFIG.EVENT_MOUSEDOWN);
        if (this._stopSelectionChange) {
            this.facade.unregisterOnEvent(ORYX.CONFIG.EVENT_SELECTION_CHANGED, this._stopSelectionChange.bind(this));
            this._stopSelectionChange = undefined
        }
    }, getRDFFromDOM: function () {
        try {
            var c = "";
            source = ORYX.PATH + "lib/extract-rdf.xsl";
            new Ajax.Request(source, {
                asynchronous: false, method: "get", onSuccess: function (e) {
                    c = e.responseText
                }.bind(this), onFailure: (function (e) {
                    ORYX.Log.error("XSL load failed" + e)
                }).bind(this)
            });
            var k = new DOMParser();
            var h = k.parseFromString(this.getSerializedDOM(), "text/xml");
            var f = k.parseFromString(c, "text/xml");
            var b = new XSLTProcessor();
            b.importStylesheet(f);
            var a = b.transformToFragment(h, document);
            var d = new XMLSerializer();
            return d.serializeToString(a)
        } catch (g) {
            console.log("error serializing " + g);
            return ""
        }
    }, isStencilSetExtensionLoaded: function (a) {
        return this.facade.getStencilSets().values().any(function (b) {
            return b.extensions().keys().any(function (c) {
                return c == a
            }.bind(this))
        }.bind(this))
    }, doLayout: function (a) {
        if (this.facade.raiseEvent) {
            this.facade.raiseEvent({type: ORYX.CONFIG.EVENT_LAYOUT, shapes: a})
        } else {
            this.facade.handleEvents({type: ORYX.CONFIG.EVENT_LAYOUT, shapes: a})
        }
    }, layoutEdges: function (b, a, d) {
        if (!this.facade.isExecutingCommands()) {
            return
        }
        var c = ORYX.Core.Command.extend({
            construct: function (f, h, k, g) {
                this.edges = f;
                this.node = h;
                this.plugin = g;
                this.offset = k;
                var e = h.absoluteXY();
                this.ulo = {x: e.x - k.x, y: e.y - k.y}
            }, execute: function () {
                if (this.changes) {
                    this.executeAgain();
                    return
                } else {
                    this.changes = [];
                    this.edges.each(function (e) {
                        this.changes.push({
                            edge: e, oldDockerPositions: e.dockers.map(function (f) {
                                return f.bounds.center()
                            })
                        })
                    }.bind(this))
                }
                this.edges.findAll(function (e) {
                    return e.dockers.length > 2
                }.bind(this)).each(function (g) {
                    if (g.dockers.first().getDockedShape() === this.node) {
                        var f = g.dockers[1];
                        if (this.align(f.bounds, g.dockers.first())) {
                            f.update()
                        }
                    } else {
                        if (g.dockers.last().getDockedShape() === this.node) {
                            var e = g.dockers[g.dockers.length - 2];
                            if (this.align(e.bounds, g.dockers.last())) {
                                e.update()
                            }
                        }
                    }
                    g._update(true);
                    g.removeUnusedDockers();
                    if (this.isBendPointIncluded(g)) {
                        this.plugin.doLayout(g);
                        return
                    }
                }.bind(this));
                this.edges.each(function (e) {
                    if (e.dockers.length == 2) {
                        var g = e.dockers.first().getAbsoluteReferencePoint() || e.dockers.first().bounds.center();
                        var f = e.dockers.last().getAbsoluteReferencePoint() || e.dockers.first().bounds.center();
                        if (Math.abs(-Math.abs(g.x - f.x) + Math.abs(this.offset.x)) < 2 || Math.abs(-Math.abs(g.y - f.y) + Math.abs(this.offset.y)) < 2) {
                            this.plugin.doLayout(e)
                        }
                    }
                }.bind(this));
                this.edges.each(function (f, e) {
                    this.changes[e].dockerPositions = f.dockers.map(function (g) {
                        return g.bounds.center()
                    })
                }.bind(this))
            }, align: function (k, f) {
                var h = f.getAbsoluteReferencePoint() || f.bounds.center();
                var l = k.center().x - h.x;
                var g = k.center().y - h.y;
                if (Math.abs(-Math.abs(l) + Math.abs(this.offset.x)) < 3 && this.offset.xs === undefined) {
                    k.moveBy({x: -l, y: 0})
                }
                if (Math.abs(-Math.abs(g) + Math.abs(this.offset.y)) < 3 && this.offset.ys === undefined) {
                    k.moveBy({y: -g, x: 0})
                }
                if (this.offset.xs !== undefined || this.offset.ys !== undefined) {
                    var e = f.getDockedShape().absoluteXY();
                    l = k.center().x - (e.x + ((h.x - e.x) / this.offset.xs));
                    g = k.center().y - (e.y + ((h.y - e.y) / this.offset.ys));
                    if (Math.abs(-Math.abs(l) + Math.abs(this.offset.x)) < 3) {
                        k.moveBy({x: -(k.center().x - h.x), y: 0})
                    }
                    if (Math.abs(-Math.abs(g) + Math.abs(this.offset.y)) < 3) {
                        k.moveBy({y: -(k.center().y - h.y), x: 0})
                    }
                }
            }, isBendPointIncluded: function (e) {
                var f = e.dockers.first().getDockedShape();
                var g = e.dockers.last().getDockedShape();
                if (f) {
                    f = f.absoluteBounds();
                    f.widen(5)
                }
                if (g) {
                    g = g.absoluteBounds();
                    g.widen(20)
                }
                return e.dockers.any(function (k, h) {
                    var l = k.bounds.center();
                    return h != 0 && h != e.dockers.length - 1 && ((f && f.isIncluded(l)) || (g && g.isIncluded(l)))
                })
            }, removeAllDocker: function (e) {
                e.dockers.slice(1, e.dockers.length - 1).each(function (f) {
                    e.removeDocker(f)
                })
            }, executeAgain: function () {
                this.changes.each(function (e) {
                    this.removeAllDocker(e.edge);
                    e.dockerPositions.each(function (h, f) {
                        if (f == 0 || f == e.dockerPositions.length - 1) {
                            return
                        }
                        var g = e.edge.createDocker(undefined, h);
                        g.bounds.centerMoveTo(h);
                        g.update()
                    }.bind(this));
                    e.edge._update(true)
                }.bind(this))
            }, rollback: function () {
                this.changes.each(function (e) {
                    this.removeAllDocker(e.edge);
                    e.oldDockerPositions.each(function (h, f) {
                        if (f == 0 || f == e.oldDockerPositions.length - 1) {
                            return
                        }
                        var g = e.edge.createDocker(undefined, h);
                        g.bounds.centerMoveTo(h);
                        g.update()
                    }.bind(this));
                    e.edge._update(true)
                }.bind(this))
            }
        });
        this.facade.executeCommands([new c(a, b, d, this)])
    }
});
if (!ORYX) {
    var ORYX = {}
}
if (!ORYX.Plugins) {
    ORYX.Plugins = {}
}
ORYX.Plugins.AbstractLayouter = ORYX.Plugins.AbstractPlugin.extend({
    layouted: [], construct: function (a) {
        arguments.callee.$.construct.apply(this, arguments);
        this.facade.registerOnEvent(ORYX.CONFIG.EVENT_LAYOUT, this._initLayout.bind(this))
    }, isIncludedInLayout: function (a) {
        if (!(this.layouted instanceof Array)) {
            this.layouted = [this.layouted].compact()
        }
        if (this.layouted.length <= 0) {
            return true
        }
        return this.layouted.any(function (b) {
            if (typeof b == "string") {
                return a.getStencil().id().include(b)
            } else {
                return a instanceof b
            }
        })
    }, _initLayout: function (c) {
        var b = [c.shapes].flatten().compact();
        var a = b.findAll(function (d) {
            return this.isIncludedInLayout(d)
        }.bind(this));
        if (a.length > 0) {
            this.layout(a)
        }
    }, layout: function (a) {
        throw new Error("Layouter has to implement the layout function.")
    }
});
if (!ORYX.Plugins) {
    ORYX.Plugins = new Object()
}
ORYX.Plugins.Edit = Clazz.extend({
    construct: function (a) {
        this.facade = a;
        this.clipboard = new ORYX.Plugins.Edit.ClipBoard();
        this.facade.offer({
            name: ORYX.I18N.Edit.cut,
            description: ORYX.I18N.Edit.cutDesc,
            icon: ORYX.PATH + "images/cut.png",
            keyCodes: [{
                metaKeys: [ORYX.CONFIG.META_KEY_META_CTRL],
                keyCode: 88,
                keyAction: ORYX.CONFIG.KEY_ACTION_DOWN
            }],
            functionality: this.callEdit.bind(this, this.editCut),
            group: ORYX.I18N.Edit.group,
            index: 1,
            minShape: 1
        });
        this.facade.offer({
            name: ORYX.I18N.Edit.copy,
            description: ORYX.I18N.Edit.copyDesc,
            icon: ORYX.PATH + "images/page_copy.png",
            keyCodes: [{
                metaKeys: [ORYX.CONFIG.META_KEY_META_CTRL],
                keyCode: 67,
                keyAction: ORYX.CONFIG.KEY_ACTION_DOWN
            }],
            functionality: this.callEdit.bind(this, this.editCopy, [true, false]),
            group: ORYX.I18N.Edit.group,
            index: 2,
            minShape: 1
        });
        this.facade.offer({
            name: ORYX.I18N.Edit.paste,
            description: ORYX.I18N.Edit.pasteDesc,
            icon: ORYX.PATH + "images/page_paste.png",
            keyCodes: [{
                metaKeys: [ORYX.CONFIG.META_KEY_META_CTRL],
                keyCode: 86,
                keyAction: ORYX.CONFIG.KEY_ACTION_DOWN
            }],
            functionality: this.callEdit.bind(this, this.editPaste),
            isEnabled: this.clipboard.isOccupied.bind(this.clipboard),
            group: ORYX.I18N.Edit.group,
            index: 3,
            minShape: 0,
            maxShape: 0
        });
        this.facade.offer({
            name: ORYX.I18N.Edit.del,
            description: ORYX.I18N.Edit.delDesc,
            icon: ORYX.PATH + "images/cross.png",
            keyCodes: [{
                metaKeys: [ORYX.CONFIG.META_KEY_META_CTRL],
                keyCode: 8,
                keyAction: ORYX.CONFIG.KEY_ACTION_DOWN
            }, {keyCode: 46, keyAction: ORYX.CONFIG.KEY_ACTION_DOWN}],
            functionality: this.callEdit.bind(this, this.editDelete),
            group: ORYX.I18N.Edit.group,
            index: 4,
            minShape: 1
        })
    }, callEdit: function (b, a) {
        window.setTimeout(function () {
            b.apply(this, (a instanceof Array ? a : []))
        }.bind(this), 1)
    }, handleMouseDown: function (a) {
        if (this._controlPressed) {
            this._controlPressed = false;
            this.editCopy();
            this.editPaste();
            a.forceExecution = true;
            this.facade.raiseEvent(a, this.clipboard.shapesAsJson)
        }
    }, getAllShapesToConsider: function (b) {
        var a = [];
        var c = [];
        b.each(function (e) {
            isChildShapeOfAnother = b.any(function (g) {
                return g.hasChildShape(e)
            });
            if (isChildShapeOfAnother) {
                return
            }
            a.push(e);
            if (e instanceof ORYX.Core.Node) {
                var f = e.getOutgoingNodes();
                f = f.findAll(function (g) {
                    return !b.include(g)
                });
                a = a.concat(f)
            }
            c = c.concat(e.getChildShapes(true))
        }.bind(this));
        var d = this.facade.getCanvas().getChildEdges().select(function (e) {
            if (a.include(e)) {
                return false
            }
            if (e.getAllDockedShapes().size() === 0) {
                return false
            }
            return e.getAllDockedShapes().all(function (f) {
                return f instanceof ORYX.Core.Edge || c.include(f)
            })
        });
        a = a.concat(d);
        return a
    }, editCut: function () {
        this.editCopy(false, true);
        this.editDelete(true);
        return false
    }, editCopy: function (c, a) {
        var b = this.facade.getSelection();
        if (b.length == 0) {
            return
        }
        this.clipboard.refresh(b, this.getAllShapesToConsider(b), this.facade.getCanvas().getStencil().stencilSet().namespace(), a);
        if (c) {
            this.facade.updateSelection()
        }
    }, editPaste: function () {
        var b = {childShapes: this.clipboard.shapesAsJson, stencilset: {namespace: this.clipboard.SSnamespace}};
        jQuery.extend(b, ORYX.Core.AbstractShape.JSONHelper);
        var a = b.getChildShapes(true).pluck("resourceId");
        var c = {};
        b.eachChild(function (d, e) {
            d.outgoing = d.outgoing.select(function (f) {
                return a.include(f.resourceId)
            });
            d.outgoing.each(function (f) {
                if (!c[f.resourceId]) {
                    c[f.resourceId] = []
                }
                c[f.resourceId].push(d)
            });
            return d
        }.bind(this), true, true);
        b.eachChild(function (d, e) {
            if (d.target && !(a.include(d.target.resourceId))) {
                d.target = undefined;
                d.targetRemoved = true
            }
            if (d.dockers && d.dockers.length >= 1 && d.dockers[0].getDocker && ((d.dockers[0].getDocker().getDockedShape() && !a.include(d.dockers[0].getDocker().getDockedShape().resourceId)) || !d.getShape().dockers[0].getDockedShape() && !c[d.resourceId])) {
                d.sourceRemoved = true
            }
            return d
        }.bind(this), true, true);
        b.eachChild(function (d, e) {
            if (this.clipboard.useOffset) {
                d.bounds = {
                    lowerRight: {
                        x: d.bounds.lowerRight.x + ORYX.CONFIG.COPY_MOVE_OFFSET,
                        y: d.bounds.lowerRight.y + ORYX.CONFIG.COPY_MOVE_OFFSET
                    },
                    upperLeft: {
                        x: d.bounds.upperLeft.x + ORYX.CONFIG.COPY_MOVE_OFFSET,
                        y: d.bounds.upperLeft.y + ORYX.CONFIG.COPY_MOVE_OFFSET
                    }
                }
            }
            if (d.dockers) {
                d.dockers = d.dockers.map(function (g, f) {
                    if ((d.targetRemoved === true && f == d.dockers.length - 1 && g.getDocker) || (d.sourceRemoved === true && f == 0 && g.getDocker)) {
                        g = g.getDocker().bounds.center()
                    }
                    if ((f == 0 && g.getDocker instanceof Function && d.sourceRemoved !== true && (g.getDocker().getDockedShape() || ((c[d.resourceId] || []).length > 0 && (!(d.getShape() instanceof ORYX.Core.Node) || c[d.resourceId][0].getShape() instanceof ORYX.Core.Node)))) || (f == d.dockers.length - 1 && g.getDocker instanceof Function && d.targetRemoved !== true && (g.getDocker().getDockedShape() || d.target))) {
                        return {x: g.x, y: g.y, getDocker: g.getDocker}
                    } else {
                        if (this.clipboard.useOffset) {
                            return {
                                x: g.x + ORYX.CONFIG.COPY_MOVE_OFFSET,
                                y: g.y + ORYX.CONFIG.COPY_MOVE_OFFSET,
                                getDocker: g.getDocker
                            }
                        } else {
                            return {x: g.x, y: g.y, getDocker: g.getDocker}
                        }
                    }
                }.bind(this))
            } else {
                if (d.getShape() instanceof ORYX.Core.Node && d.dockers && d.dockers.length > 0 && (!d.dockers.first().getDocker || d.sourceRemoved === true || !(d.dockers.first().getDocker().getDockedShape() || c[d.resourceId]))) {
                    d.dockers = d.dockers.map(function (g, f) {
                        if ((d.sourceRemoved === true && f == 0 && g.getDocker)) {
                            g = g.getDocker().bounds.center()
                        }
                        if (this.clipboard.useOffset) {
                            return {
                                x: g.x + ORYX.CONFIG.COPY_MOVE_OFFSET,
                                y: g.y + ORYX.CONFIG.COPY_MOVE_OFFSET,
                                getDocker: g.getDocker
                            }
                        } else {
                            return {x: g.x, y: g.y, getDocker: g.getDocker}
                        }
                    }.bind(this))
                }
            }
            return d
        }.bind(this), false, true);
        this.clipboard.useOffset = true;
        this.facade.importJSON(b)
    }, editDelete: function () {
        var a = this.facade.getSelection();
        var b = new ORYX.Plugins.Edit.ClipBoard();
        b.refresh(a, this.getAllShapesToConsider(a));
        var c = new ORYX.Plugins.Edit.DeleteCommand(b, this.facade);
        this.facade.executeCommands([c])
    }
});
ORYX.Plugins.Edit.ClipBoard = Clazz.extend({
    construct: function () {
        this.shapesAsJson = [];
        this.selection = [];
        this.SSnamespace = "";
        this.useOffset = true
    }, isOccupied: function () {
        return this.shapesAsJson.length > 0
    }, refresh: function (d, b, c, a) {
        this.selection = d;
        this.SSnamespace = c;
        this.outgoings = {};
        this.parents = {};
        this.targets = {};
        this.useOffset = a !== true;
        this.shapesAsJson = b.map(function (e) {
            var f = e.toJSON();
            f.parent = {resourceId: e.getParentShape().resourceId};
            f.parentIndex = e.getParentShape().getChildShapes().indexOf(e);
            return f
        })
    }
});
ORYX.Plugins.Edit.DeleteCommand = ORYX.Core.Command.extend({
    construct: function (b, a) {
        this.clipboard = b;
        this.shapesAsJson = b.shapesAsJson;
        this.facade = a;
        this.dockers = this.shapesAsJson.map(function (g) {
            var e = g.getShape();
            var f = e.getIncomingShapes().map(function (h) {
                return h.getDockers().last()
            });
            var d = e.getOutgoingShapes().map(function (h) {
                return h.getDockers().first()
            });
            var c = e.getDockers().concat(f, d).compact().map(function (h) {
                return {object: h, referencePoint: h.referencePoint, dockedShape: h.getDockedShape()}
            });
            return c
        }).flatten()
    }, execute: function () {
        this.shapesAsJson.each(function (a) {
            this.facade.deleteShape(a.getShape())
        }.bind(this));
        this.facade.setSelection([]);
        this.facade.getCanvas().update();
        this.facade.updateSelection()
    }, rollback: function () {
        this.shapesAsJson.each(function (c) {
            var a = c.getShape();
            var b = this.facade.getCanvas().getChildShapeByResourceId(c.parent.resourceId) || this.facade.getCanvas();
            b.add(a, a.parentIndex)
        }.bind(this));
        this.dockers.each(function (a) {
            a.object.setDockedShape(a.dockedShape);
            a.object.setReferencePoint(a.referencePoint)
        }.bind(this));
        this.facade.setSelection(this.selectedShapes);
        this.facade.getCanvas().update();
        this.facade.updateSelection()
    }
});
if (!ORYX.Plugins) {
    ORYX.Plugins = new Object()
}
ORYX.Plugins.View = {
    facade: undefined, construct: function (b, a) {
        this.facade = b;
        this.zoomLevel = 1;
        this.maxFitToScreenLevel = 1.5;
        this.minZoomLevel = 0.1;
        this.maxZoomLevel = 2.5;
        this.diff = 5;
        if (a !== undefined && a !== null) {
            a.properties.each(function (c) {
                if (c.zoomLevel) {
                    this.zoomLevel = Number(1)
                }
                if (c.maxFitToScreenLevel) {
                    this.maxFitToScreenLevel = Number(c.maxFitToScreenLevel)
                }
                if (c.minZoomLevel) {
                    this.minZoomLevel = Number(c.minZoomLevel)
                }
                if (c.maxZoomLevel) {
                    this.maxZoomLevel = Number(c.maxZoomLevel)
                }
            }.bind(this))
        }
        this.facade.offer({
            name: ORYX.I18N.View.zoomIn,
            functionality: this.zoom.bind(this, [1 + ORYX.CONFIG.ZOOM_OFFSET]),
            group: ORYX.I18N.View.group,
            icon: ORYX.PATH + "images/magnifier_zoom_in.png",
            description: ORYX.I18N.View.zoomInDesc,
            index: 1,
            minShape: 0,
            maxShape: 0,
            isEnabled: function () {
                return this.zoomLevel < this.maxZoomLevel
            }.bind(this)
        });
        this.facade.offer({
            name: ORYX.I18N.View.zoomOut,
            functionality: this.zoom.bind(this, [1 - ORYX.CONFIG.ZOOM_OFFSET]),
            group: ORYX.I18N.View.group,
            icon: ORYX.PATH + "images/magnifier_zoom_out.png",
            description: ORYX.I18N.View.zoomOutDesc,
            index: 2,
            minShape: 0,
            maxShape: 0,
            isEnabled: function () {
                return this._checkSize()
            }.bind(this)
        });
        this.facade.offer({
            name: ORYX.I18N.View.zoomStandard,
            functionality: this.setAFixZoomLevel.bind(this, 1),
            group: ORYX.I18N.View.group,
            icon: ORYX.PATH + "images/zoom_standard.png",
            cls: "icon-large",
            description: ORYX.I18N.View.zoomStandardDesc,
            index: 3,
            minShape: 0,
            maxShape: 0,
            isEnabled: function () {
                return this.zoomLevel != 1
            }.bind(this)
        });
        this.facade.offer({
            name: ORYX.I18N.View.zoomFitToModel,
            functionality: this.zoomFitToModel.bind(this),
            group: ORYX.I18N.View.group,
            icon: ORYX.PATH + "images/image.png",
            description: ORYX.I18N.View.zoomFitToModelDesc,
            index: 4,
            minShape: 0,
            maxShape: 0
        })
    }, setAFixZoomLevel: function (a) {
        this.zoomLevel = a;
        this._checkZoomLevelRange();
        this.zoom(1)
    }, zoom: function (d) {
        this.zoomLevel *= d;
        var h = this.facade.getCanvas().getHTMLContainer().parentNode.parentNode;
        var c = this.facade.getCanvas();
        var g = c.bounds.width() * this.zoomLevel;
        var a = c.bounds.height() * this.zoomLevel;
        var f = (c.node.parentNode.parentNode.parentNode.offsetHeight - a) / 2;
        f = f > 20 ? f - 20 : 0;
        c.node.parentNode.parentNode.style.marginTop = f + "px";
        f += 5;
        c.getHTMLContainer().style.top = f + "px";
        var b = h.scrollTop - Math.round((c.getHTMLContainer().parentNode.getHeight() - a) / 2) + this.diff;
        var e = h.scrollLeft - Math.round((c.getHTMLContainer().parentNode.getWidth() - g) / 2) + this.diff;
        c.setSize({width: g, height: a}, true);
        c.node.setAttributeNS(null, "transform", "scale(" + this.zoomLevel + ")");
        this.facade.updateSelection();
        h.scrollTop = b;
        h.scrollLeft = e;
        c.zoomLevel = this.zoomLevel
    }, zoomFitToModel: function () {
        var h = this.facade.getCanvas().getHTMLContainer().parentNode.parentNode;
        var b = h.getHeight() - 30;
        var d = h.getWidth() - 30;
        var c = this.facade.getCanvas().getChildShapes();
        if (!c || c.length < 1) {
            return false
        }
        var g = c[0].absoluteBounds().clone();
        c.each(function (k) {
            g.include(k.absoluteBounds().clone())
        });
        var f = d / g.width();
        var a = b / g.height();
        var e = a < f ? a : f;
        if (e > this.maxFitToScreenLevel) {
            e = this.maxFitToScreenLevel
        }
        this.setAFixZoomLevel(e);
        h.scrollTop = Math.round(g.upperLeft().y * this.zoomLevel) - 5;
        h.scrollLeft = Math.round(g.upperLeft().x * this.zoomLevel) - 5
    }, _checkSize: function () {
        var a = this.facade.getCanvas().getHTMLContainer().parentNode;
        var b = Math.min((a.parentNode.getWidth() / a.getWidth()), (a.parentNode.getHeight() / a.getHeight()));
        return 1.05 > b
    }, _checkZoomLevelRange: function () {
        if (this.zoomLevel < this.minZoomLevel) {
            this.zoomLevel = this.minZoomLevel
        }
        if (this.zoomLevel > this.maxZoomLevel) {
            this.zoomLevel = this.maxZoomLevel
        }
    }
};
ORYX.Plugins.View = Clazz.extend(ORYX.Plugins.View);
if (!Signavio) {
    var Signavio = {}
}
if (!Signavio.Core) {
    Signavio.Core = {}
}
Signavio.Core.Version = "1.0";
if (!Signavio) {
    var Signavio = new Object()
}
if (!Signavio.Plugins) {
    Signavio.Plugins = new Object()
}
if (!Signavio.Plugins.Utils) {
    Signavio.Plugins.Utils = new Object()
}
if (!Signavio.Helper) {
    Signavio.Helper = new Object()
}
new function () {
    ORYX.Editor.provideId = function () {
        var b = [], c = "0123456789ABCDEF";
        for (var a = 0; a < 36; a++) {
            b[a] = Math.floor(Math.random() * 16)
        }
        b[14] = 4;
        b[19] = (b[19] & 3) | 8;
        for (var a = 0; a < 36; a++) {
            b[a] = c[b[a]]
        }
        b[8] = b[13] = b[18] = b[23] = "-";
        return "sid-" + b.join("")
    }
}();
if (!ORYX.Plugins) {
    ORYX.Plugins = new Object()
}
ORYX.Plugins.Loading = {
    construct: function (a) {
        this.facade = a;
        this.node = ORYX.Editor.graft("http://www.w3.org/1999/xhtml", this.facade.getCanvas().getHTMLContainer().parentNode, ["div", {"class": "LoadingIndicator"}, ""]);
        this.facade.registerOnEvent(ORYX.CONFIG.EVENT_LOADING_ENABLE, this.enableLoading.bind(this));
        this.facade.registerOnEvent(ORYX.CONFIG.EVENT_LOADING_DISABLE, this.disableLoading.bind(this));
        this.facade.registerOnEvent(ORYX.CONFIG.EVENT_LOADING_STATUS, this.showStatus.bind(this));
        this.disableLoading()
    }, enableLoading: function (a) {
        if (a.text) {
            this.node.innerHTML = a.text + "..."
        } else {
            this.node.innerHTML = ORYX.I18N.Loading.waiting
        }
        this.node.removeClassName("StatusIndicator");
        this.node.addClassName("LoadingIndicator");
        this.node.style.display = "block";
        var b = this.facade.getCanvas().rootNode.parentNode.parentNode.parentNode.parentNode;
        this.node.style.top = b.offsetTop + "px";
        this.node.style.left = b.offsetLeft + "px"
    }, disableLoading: function () {
        this.node.style.display = "none"
    }, showStatus: function (a) {
        if (a.text) {
            this.node.innerHTML = a.text;
            this.node.addClassName("StatusIndicator");
            this.node.removeClassName("LoadingIndicator");
            this.node.style.display = "block";
            var c = this.facade.getCanvas().rootNode.parentNode.parentNode.parentNode.parentNode;
            this.node.style.top = c.offsetTop + "px";
            this.node.style.left = c.offsetLeft + "px";
            var b = a.timeout ? a.timeout : 2000;
            window.setTimeout((function () {
                this.disableLoading()
            }).bind(this), b)
        }
    }
};
ORYX.Plugins.Loading = Clazz.extend(ORYX.Plugins.Loading);
if (!ORYX.Plugins) {
    ORYX.Plugins = new Object()
}
ORYX.Plugins.CanvasResize = Clazz.extend({
    construct: function (a) {
        this.facade = a;
        new ORYX.Plugins.CanvasResizeButton(this.facade.getCanvas(), "N", this.resize.bind(this));
        new ORYX.Plugins.CanvasResizeButton(this.facade.getCanvas(), "W", this.resize.bind(this));
        new ORYX.Plugins.CanvasResizeButton(this.facade.getCanvas(), "E", this.resize.bind(this));
        new ORYX.Plugins.CanvasResizeButton(this.facade.getCanvas(), "S", this.resize.bind(this));
        window.setTimeout(function () {
            jQuery(window).trigger("resize")
        })
    }, resize: function (a, c) {
        resizeCanvas = function (l, m, o) {
            var f = o.getCanvas();
            var n = f.bounds;
            var h = o.getCanvas().getHTMLContainer().parentNode.parentNode;
            if (l == "E" || l == "W") {
                f.setSize({width: (n.width() + m) * f.zoomLevel, height: (n.height()) * f.zoomLevel})
            } else {
                if (l == "S" || l == "N") {
                    f.setSize({width: (n.width()) * f.zoomLevel, height: (n.height() + m) * f.zoomLevel})
                }
            }
            if (l == "N" || l == "W") {
                var g = l == "N" ? {x: 0, y: m} : {x: m, y: 0};
                f.getChildNodes(false, function (q) {
                    q.bounds.moveBy(g)
                });
                var k = f.getChildEdges().findAll(function (q) {
                    return q.getAllDockedShapes().length > 0
                });
                var p = k.collect(function (q) {
                    return q.dockers.findAll(function (r) {
                        return !r.getDockedShape()
                    })
                }).flatten();
                p.each(function (q) {
                    q.bounds.moveBy(g)
                })
            } else {
                if (l == "S") {
                    h.scrollTop += m
                } else {
                    if (l == "E") {
                        h.scrollLeft += m
                    }
                }
            }
            jQuery(window).trigger("resize");
            f.update();
            o.updateSelection()
        };
        var b = ORYX.Core.Command.extend({
            construct: function (f, h, g) {
                this.position = f;
                this.extentionSize = h;
                this.facade = g
            }, execute: function () {
                resizeCanvas(this.position, this.extentionSize, this.facade)
            }, rollback: function () {
                resizeCanvas(this.position, -this.extentionSize, this.facade)
            }, update: function () {
            }
        });
        var d = ORYX.CONFIG.CANVAS_RESIZE_INTERVAL;
        if (c) {
            d = -d
        }
        var e = new b(a, d, this.facade);
        this.facade.executeCommands([e])
    }
});
ORYX.Plugins.CanvasResizeButton = Clazz.extend({
    construct: function (b, t, g) {
        this.canvas = b;
        var k = b.getHTMLContainer().parentNode;
        window.myParent = k;
        var s = jQuery("#canvasSection")[0];
        var d = s;
        var e = jQuery("#canvasSection").find(".ORYX_Editor")[0];
        var f = e.children[0];
        var a = "glyphicon glyphicon-chevron-";
        var p = "glyphicon glyphicon-chevron-";
        if (t == "N") {
            a += "up";
            p += "down"
        } else {
            if (t == "S") {
                a += "down";
                p += "up"
            } else {
                if (t == "E") {
                    a += "right";
                    p += "left"
                } else {
                    if (t == "W") {
                        a += "left";
                        p += "right"
                    }
                }
            }
        }
        var l = "canvas-shrink-" + t;
        var r = "canvas-grow-" + t;
        var c = ORYX.Editor.graft("http://www.w3.org/1999/xhtml", k, ["div", {
            "class": "canvas_resize_indicator canvas_resize_indicator_grow " + t,
            id: l,
            title: ORYX.I18N.RESIZE.tipGrow + ORYX.I18N.RESIZE[t]
        }, ["i", {"class": a}]]);
        var h = ORYX.Editor.graft("http://www.w3.org/1999/xhtml", k, ["div", {
            "class": "canvas_resize_indicator canvas_resize_indicator_shrink " + t,
            id: r,
            title: ORYX.I18N.RESIZE.tipGrow + ORYX.I18N.RESIZE[t]
        }, ["i", {"class": p}]]);
        var m = 60;
        var q = function (w) {
            var x = w.target.id.indexOf("canvas-shrink") != -1 || w.target.id.indexOf("canvas-grow") != -1 || w.target.parentNode.id.indexOf("canvas-shrink") != -1 || w.target.parentNode.id.indexOf("canvas-grow") != -1;
            if (x) {
                if (w.target.id == l || w.target.id == r || w.target.parentNode.id == l || w.target.parentNode.id == r) {
                    return true
                } else {
                    return false
                }
            }
            if (w.target != k && w.target != d && w.target != d.firstChild && w.target != f && w.target != d) {
                return false
            }
            var z = w.offsetX !== undefined ? w.offsetX : w.layerX;
            var y = w.offsetY !== undefined ? w.offsetY : w.layerY;
            var u = 0;
            if (e.clientWidth < s.clientWidth) {
                var v = s.clientWidth - e.clientWidth;
                u = v / 2
            }
            y = y - s.scrollTop;
            z = z - s.scrollLeft;
            if (t == "N") {
                return y < m
            } else {
                if (t == "W") {
                    return z < m + u
                } else {
                    if (t == "E") {
                        return s.clientWidth - z < m + u
                    } else {
                        if (t == "S") {
                            return s.clientHeight - y < m
                        }
                    }
                }
            }
            return false
        };
        var n = (function () {
            c.show();
            var u = b.bounds.width();
            var v = b.bounds.height();
            if (t == "N" && (v - ORYX.CONFIG.CANVAS_RESIZE_INTERVAL > ORYX.CONFIG.CANVAS_MIN_HEIGHT)) {
                h.show()
            } else {
                if (t == "E" && (u - ORYX.CONFIG.CANVAS_RESIZE_INTERVAL > ORYX.CONFIG.CANVAS_MIN_WIDTH)) {
                    h.show()
                } else {
                    if (t == "S" && (v - ORYX.CONFIG.CANVAS_RESIZE_INTERVAL > ORYX.CONFIG.CANVAS_MIN_HEIGHT)) {
                        h.show()
                    } else {
                        if (t == "W" && (u - ORYX.CONFIG.CANVAS_RESIZE_INTERVAL > ORYX.CONFIG.CANVAS_MIN_WIDTH)) {
                            h.show()
                        } else {
                            h.hide()
                        }
                    }
                }
            }
        }).bind(this);
        var o = function () {
            c.hide();
            h.hide()
        };
        k.parentNode.addEventListener(ORYX.CONFIG.EVENT_MOUSEMOVE, function (u) {
            if (q(u)) {
                n()
            } else {
                o()
            }
        }, false);
        c.addEventListener(ORYX.CONFIG.EVENT_MOUSEOVER, function (u) {
            n()
        }, true);
        h.addEventListener(ORYX.CONFIG.EVENT_MOUSEOVER, function (u) {
            n()
        }, true);
        k.parentNode.addEventListener(ORYX.CONFIG.EVENT_MOUSEOUT, function (u) {
            o()
        }, true);
        o();
        c.addEventListener("click", function () {
            g(t);
            n()
        }, true);
        h.addEventListener("click", function () {
            g(t, true);
            n()
        }, true)
    }
});
if (!ORYX.Plugins) {
    ORYX.Plugins = new Object()
}
ORYX.Plugins.RenameShapes = Clazz.extend({
    facade: undefined, construct: function (a) {
        this.facade = a;
        this.facade.registerOnEvent(ORYX.CONFIG.EVENT_CANVAS_SCROLL, this.hideField.bind(this));
        this.facade.registerOnEvent(ORYX.CONFIG.EVENT_DBLCLICK, this.actOnDBLClick.bind(this));
        this.facade.offer({
            keyCodes: [{keyCode: 113, keyAction: ORYX.CONFIG.KEY_ACTION_DOWN}],
            functionality: this.renamePerF2.bind(this)
        });
        document.documentElement.addEventListener(ORYX.CONFIG.EVENT_MOUSEDOWN, this.hide.bind(this), true)
    }, renamePerF2: function () {
        var a = this.facade.getSelection();
        this.actOnDBLClick(undefined, a.first())
    }, actOnDBLClick: function (p, l) {
        if (!(l instanceof ORYX.Core.Shape)) {
            return
        }
        this.destroy();
        var m = l.getStencil().properties().findAll(function (t) {
            return (t.refToView() && t.refToView().length > 0 && t.directlyEditable())
        });
        m = m.findAll(function (t) {
            return !t.readonly() && (t.type() == ORYX.CONFIG.TYPE_STRING || t.type() == ORYX.CONFIG.TYPE_EXPRESSION || t.type() == ORYX.CONFIG.TYPE_DATASOURCE)
        });
        var n = m.collect(function (t) {
            return t.refToView()
        }).flatten().compact();
        var h = l.getLabels().findAll(function (t) {
            return n.any(function (u) {
                return t.id.endsWith(u)
            })
        });
        if (h.length == 0) {
            return
        }
        var k = h.length <= 1 ? h[0] : null;
        if (!k) {
            k = h.find(function (t) {
                return t.node == p.target || t.node == p.target.parentNode
            });
            if (!k) {
                var q = this.facade.eventCoordinates(p);
                var b = 1;
                if (!isNaN(screen.logicalXDPI) && !isNaN(screen.systemXDPI)) {
                    var e = navigator.userAgent;
                    if (e.indexOf("MSIE") >= 0) {
                        var r = Math.round((screen.deviceXDPI / screen.logicalXDPI) * 100);
                        if (r !== 100) {
                            b = r / 100
                        }
                    }
                }
                if (b !== 1) {
                    q.x = q.x / b;
                    q.y = q.y / b
                }
                q.y += $("editor-header").clientHeight - $("canvasSection").scrollTop - 5;
                if (KISBPM.HEADER_CONFIG.showAppTitle == false) {
                    q.y += 61
                }
                q.x -= $("canvasSection").scrollLeft;
                var s = this.facade.getCanvas().rootNode.lastChild.getScreenCTM();
                q.x *= s.a;
                q.y *= s.d;
                var o = h.collect(function (v) {
                    var u = this.getCenterPosition(v.node);
                    var t = Math.sqrt(Math.pow(u.x - q.x, 2) + Math.pow(u.y - q.y, 2));
                    return {diff: t, label: v}
                }.bind(this));
                o.sort(function (u, t) {
                    return u.diff > t.diff
                });
                k = o[0].label
            }
        }
        var d = m.find(function (t) {
            return t.refToView().any(function (u) {
                return k.id == l.id + u
            })
        });
        var f = Math.min(Math.max(100, l.bounds.width()), 200);
        var a = this.getCenterPosition(k.node, l);
        a.x -= (f / 2);
        var c = d.prefix() + "-" + d.id();
        var g = document.createElement("textarea");
        g.id = "shapeTextInput";
        g.style.position = "absolute";
        g.style.width = f + "px";
        g.style.left = (a.x < 10) ? 10 : a.x + "px";
        g.style.top = (a.y - 15) + "px";
        g.className = "x-form-textarea x-form-field x_form_text_set_absolute";
        g.value = l.properties[c];
        this.oldValueText = l.properties[c];
        document.getElementById("canvasSection").appendChild(g);
        this.shownTextField = g;
        this.updateValueFunction = function (x, u) {
            var w = l;
            var v = this.facade;
            if (u != x) {
                var t = ORYX.Core.Command.extend({
                    construct: function () {
                        this.el = w;
                        this.propId = c;
                        this.oldValue = u;
                        this.newValue = x;
                        this.facade = v
                    }, execute: function () {
                        this.el.setProperty(this.propId, this.newValue);
                        this.facade.setSelection([this.el]);
                        this.facade.getCanvas().update();
                        this.facade.updateSelection()
                    }, rollback: function () {
                        this.el.setProperty(this.propId, this.oldValue);
                        this.facade.setSelection([this.el]);
                        this.facade.getCanvas().update();
                        this.facade.updateSelection()
                    }
                });
                var y = new t();
                this.facade.executeCommands([y])
            }
        }.bind(this);
        jQuery("#shapeTextInput").focus();
        jQuery("#shapeTextInput").autogrow();
        this.facade.disableEvent(ORYX.CONFIG.EVENT_KEYDOWN)
    }, getCenterPosition: function (f, h) {
        if (!f) {
            return {x: 0, y: 0}
        }
        var e = this.facade.getCanvas().node.getScreenCTM();
        var b = h.bounds.upperLeft();
        var p = true;
        var n = h;
        while (p) {
            if (n.getParentShape().getStencil().idWithoutNs() === "BPMNDiagram") {
                p = false
            } else {
                var l = n.getParentShape().bounds.upperLeft();
                b.x += l.x;
                b.y += l.y;
                n = n.getParentShape()
            }
        }
        var c = h.bounds.midPoint();
        c.x += b.x + e.e;
        c.y += b.y + e.f;
        c.x *= e.a;
        c.y *= e.d;
        var a = 1;
        if (!isNaN(screen.logicalXDPI) && !isNaN(screen.systemXDPI)) {
            var d = navigator.userAgent;
            if (d.indexOf("MSIE") >= 0) {
                var r = Math.round((screen.deviceXDPI / screen.logicalXDPI) * 100);
                if (r !== 100) {
                    a = r / 100
                }
            }
        }
        if (a === 1) {
            c.y = c.y - jQuery("#canvasSection").offset().top + 5;
            c.x -= jQuery("#canvasSection").offset().left
        } else {
            var m = jQuery("#canvasSection").offset().left;
            var o = jQuery("#canvasSection").scrollLeft();
            var k = jQuery("#canvasSection").scrollTop();
            var g = e.e - (m * a);
            var q = 0;
            if (g > 10) {
                q = (g / a) - g
            }
            c.y = c.y - (jQuery("#canvasSection").offset().top * a) + 5 + ((k * a) - k);
            c.x = c.x - (m * a) + q + ((o * a) - o)
        }
        return c
    }, hide: function (b) {
        if (this.shownTextField && (!b || b.target !== this.shownTextField)) {
            var a = this.shownTextField.value;
            if (a !== this.oldValueText) {
                this.updateValueFunction(a, this.oldValueText)
            }
            this.destroy()
        }
    }, hideField: function (a) {
        if (this.shownTextField) {
            this.destroy()
        }
    }, destroy: function (a) {
        var b = jQuery("#shapeTextInput");
        if (b) {
            b.remove();
            delete this.shownTextField;
            this.facade.enableEvent(ORYX.CONFIG.EVENT_KEYDOWN)
        }
    }
});
if (!ORYX.Plugins) {
    ORYX.Plugins = new Object()
}
ORYX.Plugins.ProcessLink = Clazz.extend({
    facade: undefined, construct: function (a) {
        this.facade = a;
        this.facade.registerOnEvent(ORYX.CONFIG.EVENT_PROPERTY_CHANGED, this.propertyChanged.bind(this))
    }, propertyChanged: function (a, b) {
        if (a.name !== "oryx-refuri" || !b instanceof ORYX.Core.Node) {
            return
        }
        if (a.value && a.value.length > 0 && a.value != "undefined") {
            this.show(b, a.value)
        } else {
            this.hide(b)
        }
    }, show: function (a, b) {
        var c = ORYX.Editor.graft("http://www.w3.org/2000/svg", null, ["a", {target: "_blank"}, ["path", {
            "stroke-width": 1,
            stroke: "#00DD00",
            fill: "#00AA00",
            d: "M3,3 l0,-2.5 l7.5,0 l0,-2.5 l7.5,4.5 l-7.5,3.5 l0,-2.5 l-8,0",
            "line-captions": "round"
        }]]);
        var c = ORYX.Editor.graft("http://www.w3.org/2000/svg", null, ["a", {target: "_blank"}, ["path", {
            style: "fill:#92BFFC;stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-width:0.72",
            d: "M0 1.44 L0 15.05 L11.91 15.05 L11.91 5.98 L7.37 1.44 L0 1.44 Z"
        }], ["path", {
            style: "stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-width:0.72;fill:none;",
            transform: "translate(7.5, -8.5)",
            d: "M0 10.51 L0 15.05 L4.54 15.05"
        }], ["path", {
            style: "fill:#f28226;stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-width:0.72",
            transform: "translate(-3, -1)",
            d: "M0 8.81 L0 13.06 L5.95 13.06 L5.95 15.05 A50.2313 50.2313 -175.57 0 0 10.77 11.08 A49.9128 49.9128 -1.28 0 0 5.95 6.54 L5.95 8.81 L0 8.81 Z"
        }],]);
        c.setAttributeNS("http://www.w3.org/1999/xlink", "xlink:href", b);
        this.facade.raiseEvent({
            type: ORYX.CONFIG.EVENT_OVERLAY_SHOW,
            id: "arissupport.urlref_" + a.id,
            shapes: [a],
            node: c,
            nodePosition: "SE"
        })
    }, hide: function (a) {
        this.facade.raiseEvent({type: ORYX.CONFIG.EVENT_OVERLAY_HIDE, id: "arissupport.urlref_" + a.id})
    }
});
Array.prototype.insertFrom = function (e, d) {
    d = Math.max(0, d);
    e = Math.min(Math.max(0, e), this.length - 1);
    var b = this[e];
    var a = this.without(b);
    var c = a.slice(0, d);
    c.push(b);
    if (a.length > d) {
        c = c.concat(a.slice(d))
    }
    return c
};
if (!ORYX.Plugins) {
    ORYX.Plugins = new Object()
}
ORYX.Plugins.Arrangement = ORYX.Plugins.AbstractPlugin.extend({
    facade: undefined, construct: function (a) {
        this.facade = a;
        this.facade.offer({
            name: ORYX.I18N.Arrangement.am,
            functionality: this.alignShapes.bind(this, [ORYX.CONFIG.EDITOR_ALIGN_MIDDLE]),
            group: ORYX.I18N.Arrangement.groupA,
            icon: ORYX.PATH + "images/shape_align_middle.png",
            description: ORYX.I18N.Arrangement.amDesc,
            index: 1,
            minShape: 2
        });
        this.facade.offer({
            name: ORYX.I18N.Arrangement.ac,
            functionality: this.alignShapes.bind(this, [ORYX.CONFIG.EDITOR_ALIGN_CENTER]),
            group: ORYX.I18N.Arrangement.groupA,
            icon: ORYX.PATH + "images/shape_align_center.png",
            description: ORYX.I18N.Arrangement.acDesc,
            index: 2,
            minShape: 2
        });
        this.facade.offer({
            name: ORYX.I18N.Arrangement.as,
            functionality: this.alignShapes.bind(this, [ORYX.CONFIG.EDITOR_ALIGN_SIZE]),
            group: ORYX.I18N.Arrangement.groupA,
            icon: ORYX.PATH + "images/shape_align_size.png",
            description: ORYX.I18N.Arrangement.asDesc,
            index: 3,
            minShape: 2
        });
        this.facade.registerOnEvent(ORYX.CONFIG.EVENT_ARRANGEMENT_TOP, this.setZLevel.bind(this, this.setToTop));
        this.facade.registerOnEvent(ORYX.CONFIG.EVENT_ARRANGEMENT_BACK, this.setZLevel.bind(this, this.setToBack));
        this.facade.registerOnEvent(ORYX.CONFIG.EVENT_ARRANGEMENT_FORWARD, this.setZLevel.bind(this, this.setForward));
        this.facade.registerOnEvent(ORYX.CONFIG.EVENT_ARRANGEMENT_BACKWARD, this.setZLevel.bind(this, this.setBackward))
    }, onSelectionChanged: function (a) {
        var b = this.facade.getSelection();
        if (b.length === 1 && b[0] instanceof ORYX.Core.Edge) {
            this.setToTop(b)
        }
    }, setZLevel: function (d, b) {
        var a = ORYX.Core.Command.extend({
            construct: function (g, f, e) {
                this.callback = g;
                this.elements = f;
                this.elAndIndex = f.map(function (h) {
                    return {el: h, previous: h.parent.children[h.parent.children.indexOf(h) - 1]}
                });
                this.facade = e
            }, execute: function () {
                this.callback(this.elements);
                this.facade.setSelection(this.elements)
            }, rollback: function () {
                var g = this.elAndIndex.sortBy(function (n) {
                    var o = n.el;
                    var m = $A(o.node.parentNode.childNodes);
                    return m.indexOf(o.node)
                });
                for (var f = 0; f < g.length; f++) {
                    var h = g[f].el;
                    var k = h.parent;
                    var l = k.children.indexOf(h);
                    var e = k.children.indexOf(g[f].previous);
                    e = e || 0;
                    k.children = k.children.insertFrom(l, e);
                    h.node.parentNode.insertBefore(h.node, h.node.parentNode.childNodes[e + 1])
                }
                this.facade.setSelection(this.elements)
            }
        });
        var c = new a(d, this.facade.getSelection(), this.facade);
        if (b.excludeCommand) {
            c.execute()
        } else {
            this.facade.executeCommands([c])
        }
    }, setToTop: function (b) {
        var a = b.sortBy(function (e, c) {
            var d = $A(e.node.parentNode.childNodes);
            return d.indexOf(e.node)
        });
        a.each(function (c) {
            var d = c.parent;
            if (d.children.last() === c) {
                return
            }
            d.children = d.children.without(c);
            d.children.push(c);
            c.node.parentNode.appendChild(c.node)
        })
    }, setToBack: function (b) {
        var a = b.sortBy(function (e, c) {
            var d = $A(e.node.parentNode.childNodes);
            return d.indexOf(e.node)
        });
        a = a.reverse();
        a.each(function (c) {
            var d = c.parent;
            d.children = d.children.without(c);
            d.children.unshift(c);
            c.node.parentNode.insertBefore(c.node, c.node.parentNode.firstChild)
        })
    }, setBackward: function (c) {
        var b = c.sortBy(function (f, d) {
            var e = $A(f.node.parentNode.childNodes);
            return e.indexOf(f.node)
        });
        b = b.reverse();
        var a = b.findAll(function (d) {
            return !b.some(function (e) {
                return e.node == d.node.previousSibling
            })
        });
        a.each(function (e) {
            if (e.node.previousSibling === null) {
                return
            }
            var f = e.parent;
            var d = f.children.indexOf(e);
            f.children = f.children.insertFrom(d, d - 1);
            e.node.parentNode.insertBefore(e.node, e.node.previousSibling)
        })
    }, setForward: function (c) {
        var b = c.sortBy(function (f, d) {
            var e = $A(f.node.parentNode.childNodes);
            return e.indexOf(f.node)
        });
        var a = b.findAll(function (d) {
            return !b.some(function (e) {
                return e.node == d.node.nextSibling
            })
        });
        a.each(function (f) {
            var d = f.node.nextSibling;
            if (d === null) {
                return
            }
            var e = f.parent.children.indexOf(f);
            var g = f.parent;
            g.children = g.children.insertFrom(e, e + 1);
            f.node.parentNode.insertBefore(d, f.node)
        })
    }, alignShapes: function (b) {
        var f = this.facade.getSelection();
        f = this.facade.getCanvas().getShapesWithSharedParent(f);
        f = f.findAll(function (h) {
            return (h instanceof ORYX.Core.Node)
        });
        f = f.findAll(function (h) {
            var k = h.getIncomingShapes();
            return k.length == 0 || !f.include(k[0])
        });
        if (f.length < 2) {
            return
        }
        var e = f[0].absoluteBounds().clone();
        f.each(function (h) {
            e.include(h.absoluteBounds().clone())
        });
        var d = 0;
        var c = 0;
        f.each(function (h) {
            d = Math.max(h.bounds.width(), d);
            c = Math.max(h.bounds.height(), c)
        });
        var a = ORYX.Core.Command.extend({
            construct: function (o, n, m, l, h, k) {
                this.elements = o;
                this.bounds = n;
                this.maxHeight = m;
                this.maxWidth = l;
                this.way = h;
                this.facade = k.facade;
                this.plugin = k;
                this.orgPos = []
            }, setBounds: function (h, l) {
                if (!l) {
                    l = {width: ORYX.CONFIG.MAXIMUM_SIZE, height: ORYX.CONFIG.MAXIMUM_SIZE}
                }
                if (!h.bounds) {
                    throw"Bounds not definined."
                }
                var k = {
                    a: {
                        x: h.bounds.upperLeft().x - (this.maxWidth - h.bounds.width()) / 2,
                        y: h.bounds.upperLeft().y - (this.maxHeight - h.bounds.height()) / 2
                    },
                    b: {
                        x: h.bounds.lowerRight().x + (this.maxWidth - h.bounds.width()) / 2,
                        y: h.bounds.lowerRight().y + (this.maxHeight - h.bounds.height()) / 2
                    }
                };
                if (this.maxWidth > l.width) {
                    k.a.x = h.bounds.upperLeft().x - (l.width - h.bounds.width()) / 2;
                    k.b.x = h.bounds.lowerRight().x + (l.width - h.bounds.width()) / 2
                }
                if (this.maxHeight > l.height) {
                    k.a.y = h.bounds.upperLeft().y - (l.height - h.bounds.height()) / 2;
                    k.b.y = h.bounds.lowerRight().y + (l.height - h.bounds.height()) / 2
                }
                h.bounds.set(k)
            }, execute: function () {
                this.elements.each(function (h, k) {
                    this.orgPos[k] = h.bounds.upperLeft();
                    var l = this.bounds.clone();
                    var o;
                    if (h.parent && !(h.parent instanceof ORYX.Core.Canvas)) {
                        var n = h.parent.absoluteBounds().upperLeft();
                        l.moveBy(-n.x, -n.y)
                    }
                    switch (this.way) {
                        case ORYX.CONFIG.EDITOR_ALIGN_BOTTOM:
                            o = {x: h.bounds.upperLeft().x, y: l.b.y - h.bounds.height()};
                            break;
                        case ORYX.CONFIG.EDITOR_ALIGN_MIDDLE:
                            o = {x: h.bounds.upperLeft().x, y: (l.a.y + l.b.y - h.bounds.height()) / 2};
                            break;
                        case ORYX.CONFIG.EDITOR_ALIGN_TOP:
                            o = {x: h.bounds.upperLeft().x, y: l.a.y};
                            break;
                        case ORYX.CONFIG.EDITOR_ALIGN_LEFT:
                            o = {x: l.a.x, y: h.bounds.upperLeft().y};
                            break;
                        case ORYX.CONFIG.EDITOR_ALIGN_CENTER:
                            o = {x: (l.a.x + l.b.x - h.bounds.width()) / 2, y: h.bounds.upperLeft().y};
                            break;
                        case ORYX.CONFIG.EDITOR_ALIGN_RIGHT:
                            o = {x: l.b.x - h.bounds.width(), y: h.bounds.upperLeft().y};
                            break;
                        case ORYX.CONFIG.EDITOR_ALIGN_SIZE:
                            if (h.isResizable) {
                                this.orgPos[k] = {a: h.bounds.upperLeft(), b: h.bounds.lowerRight()};
                                this.setBounds(h, h.maximumSize)
                            }
                            break
                    }
                    if (o) {
                        var m = {x: h.bounds.upperLeft().x - o.x, y: h.bounds.upperLeft().y - o.y};
                        h.bounds.moveTo(o);
                        this.plugin.layoutEdges(h, h.getAllDockedShapes(), m)
                    }
                }.bind(this))
            }, rollback: function () {
                this.elements.each(function (h, k) {
                    if (this.way == ORYX.CONFIG.EDITOR_ALIGN_SIZE) {
                        if (h.isResizable) {
                            h.bounds.set(this.orgPos[k])
                        }
                    } else {
                        h.bounds.moveTo(this.orgPos[k])
                    }
                }.bind(this))
            }
        });
        var g = new a(f, e, c, d, parseInt(b), this);
        this.facade.executeCommands([g])
    }
});
if (!ORYX.Plugins) {
    ORYX.Plugins = new Object()
}
ORYX.Plugins.Save = Clazz.extend({
    facade: undefined, processURI: undefined, changeSymbol: "*", construct: function (a) {
        this.facade = a;
        document.addEventListener("keydown", function (b) {
            if (b.ctrlKey && b.keyCode === 83) {
                Event.stop(b)
            }
        }, false);
        window.onbeforeunload = this.onUnLoad.bind(this);
        this.changeDifference = 0;
        this.facade.registerOnEvent(ORYX.CONFIG.EVENT_UNDO_EXECUTE, function () {
            this.changeDifference++;
            this.updateTitle()
        }.bind(this));
        this.facade.registerOnEvent(ORYX.CONFIG.EVENT_EXECUTE_COMMANDS, function () {
            this.changeDifference++;
            this.updateTitle()
        }.bind(this));
        this.facade.registerOnEvent(ORYX.CONFIG.EVENT_SAVED, function () {
            this.changeDifference = 0;
            this.updateTitle()
        }.bind(this));
        this.facade.registerOnEvent(ORYX.CONFIG.EVENT_UNDO_ROLLBACK, function () {
            this.changeDifference--;
            this.updateTitle()
        }.bind(this));
        this.hasChanges = this._hasChanges.bind(this)
    }, updateTitle: function () {
        var a = window.document.title || document.getElementsByTagName("title")[0].childNodes[0].nodeValue;
        if (this.changeDifference === 0 && a.startsWith(this.changeSymbol)) {
            window.document.title = a.slice(1)
        } else {
            if (this.changeDifference !== 0 && !a.startsWith(this.changeSymbol)) {
                window.document.title = this.changeSymbol + "" + a
            }
        }
    }, _hasChanges: function () {
        return this.changeDifference !== 0 || (this.facade.getModelMetaData()["new"] && this.facade.getCanvas().getChildShapes().size() > 0)
    }, onUnLoad: function () {
        if (this._hasChanges()) {
            return ORYX.I18N.Save.unsavedData
        }
    }
});
if (!ORYX.Plugins) {
    ORYX.Plugins = new Object()
}
ORYX.Plugins.DragDropResize = ORYX.Plugins.AbstractPlugin.extend({
    construct: function (b) {
        this.facade = b;
        this.currentShapes = [];
        this.toMoveShapes = [];
        this.distPoints = [];
        this.isResizing = false;
        this.dragEnable = false;
        this.dragIntialized = false;
        this.edgesMovable = true;
        this.offSetPosition = {x: 0, y: 0};
        this.faktorXY = {x: 1, y: 1};
        this.containmentParentNode;
        this.isAddingAllowed = false;
        this.isAttachingAllowed = false;
        this.callbackMouseMove = this.handleMouseMove.bind(this);
        this.callbackMouseUp = this.handleMouseUp.bind(this);
        var a = this.facade.getCanvas().getSvgContainer();
        this.selectedRect = new ORYX.Plugins.SelectedRect(a);
        if (ORYX.CONFIG.SHOW_GRIDLINE) {
            this.vLine = new ORYX.Plugins.GridLine(a, ORYX.Plugins.GridLine.DIR_VERTICAL);
            this.hLine = new ORYX.Plugins.GridLine(a, ORYX.Plugins.GridLine.DIR_HORIZONTAL)
        }
        a = this.facade.getCanvas().getHTMLContainer();
        this.scrollNode = this.facade.getCanvas().rootNode.parentNode.parentNode;
        this.resizerSE = new ORYX.Plugins.Resizer(a, "southeast", this.facade);
        this.resizerSE.registerOnResize(this.onResize.bind(this));
        this.resizerSE.registerOnResizeEnd(this.onResizeEnd.bind(this));
        this.resizerSE.registerOnResizeStart(this.onResizeStart.bind(this));
        this.resizerNW = new ORYX.Plugins.Resizer(a, "northwest", this.facade);
        this.resizerNW.registerOnResize(this.onResize.bind(this));
        this.resizerNW.registerOnResizeEnd(this.onResizeEnd.bind(this));
        this.resizerNW.registerOnResizeStart(this.onResizeStart.bind(this));
        this.facade.registerOnEvent(ORYX.CONFIG.EVENT_MOUSEDOWN, this.handleMouseDown.bind(this))
    }, handleMouseDown: function (d, c) {
        if (!this.dragBounds || !this.currentShapes.member(c) || !this.toMoveShapes.length) {
            return
        }
        this.dragEnable = true;
        this.dragIntialized = true;
        this.edgesMovable = true;
        var b = this.facade.getCanvas().node.getScreenCTM();
        this.faktorXY.x = b.a;
        this.faktorXY.y = b.d;
        var g = Event.pointerX(d);
        var e = Event.pointerY(d);
        var f = this.dragBounds.upperLeft();
        this.offSetPosition = {x: g - (f.x * this.faktorXY.x), y: e - (f.y * this.faktorXY.y)};
        this.offsetScroll = {x: this.scrollNode.scrollLeft, y: this.scrollNode.scrollTop};
        document.documentElement.addEventListener(ORYX.CONFIG.EVENT_MOUSEMOVE, this.callbackMouseMove, false);
        document.documentElement.addEventListener(ORYX.CONFIG.EVENT_MOUSEUP, this.callbackMouseUp, true);
        return
    }, handleMouseUp: function (d) {
        this.facade.raiseEvent({type: ORYX.CONFIG.EVENT_HIGHLIGHT_HIDE, highlightId: "dragdropresize.contain"});
        this.facade.raiseEvent({type: ORYX.CONFIG.EVENT_HIGHLIGHT_HIDE, highlightId: "dragdropresize.attached"});
        if (this.dragEnable) {
            if (!this.dragIntialized) {
                this.afterDrag();
                if (this.isAttachingAllowed && this.toMoveShapes.length == 1 && this.toMoveShapes[0] instanceof ORYX.Core.Node && this.toMoveShapes[0].dockers.length > 0) {
                    var b = this.facade.eventCoordinates(d);
                    var e = this.toMoveShapes[0].dockers[0];
                    var c = ORYX.Core.Command.extend({
                        construct: function (k, f, h, g) {
                            this.docker = k;
                            this.newPosition = f;
                            this.newDockedShape = h;
                            this.newParent = h.parent || g.getCanvas();
                            this.oldPosition = k.parent.bounds.center();
                            this.oldDockedShape = k.getDockedShape();
                            this.oldParent = k.parent.parent || g.getCanvas();
                            this.facade = g;
                            if (this.oldDockedShape) {
                                this.oldPosition = k.parent.absoluteBounds().center()
                            }
                        }, execute: function () {
                            this.dock(this.newDockedShape, this.newParent, this.newPosition);
                            this.facade.raiseEvent({type: ORYX.CONFIG.EVENT_ARRANGEMENT_TOP, excludeCommand: true})
                        }, rollback: function () {
                            this.dock(this.oldDockedShape, this.oldParent, this.oldPosition)
                        }, dock: function (f, g, h) {
                            g.add(this.docker.parent);
                            this.docker.setDockedShape(undefined);
                            this.docker.bounds.centerMoveTo(h);
                            this.docker.setDockedShape(f);
                            this.facade.setSelection([this.docker.parent]);
                            this.facade.getCanvas().update();
                            this.facade.updateSelection()
                        }
                    });
                    var a = [new c(e, b, this.containmentParentNode, this.facade)];
                    this.facade.executeCommands(a)
                } else {
                    if (this.isAddingAllowed) {
                        this.refreshSelectedShapes()
                    }
                }
                this.facade.updateSelection();
                this.facade.raiseEvent({type: ORYX.CONFIG.EVENT_DRAGDROP_END})
            }
            if (this.vLine) {
                this.vLine.hide()
            }
            if (this.hLine) {
                this.hLine.hide()
            }
        }
        this.dragEnable = false;
        document.documentElement.removeEventListener(ORYX.CONFIG.EVENT_MOUSEUP, this.callbackMouseUp, true);
        document.documentElement.removeEventListener(ORYX.CONFIG.EVENT_MOUSEMOVE, this.callbackMouseMove, false);
        return
    }, handleMouseMove: function (b) {
        if (!this.dragEnable) {
            return
        }
        if (this.dragIntialized) {
            this.facade.raiseEvent({type: ORYX.CONFIG.EVENT_DRAGDROP_START});
            this.dragIntialized = false;
            this.resizerSE.hide();
            this.resizerNW.hide();
            this._onlyEdges = this.currentShapes.all(function (c) {
                return (c instanceof ORYX.Core.Edge)
            });
            this.beforeDrag();
            this._currentUnderlyingNodes = []
        }
        var e = {x: Event.pointerX(b) - this.offSetPosition.x, y: Event.pointerY(b) - this.offSetPosition.y};
        e.x -= this.offsetScroll.x - this.scrollNode.scrollLeft;
        e.y -= this.offsetScroll.y - this.scrollNode.scrollTop;
        var k = b.shiftKey || b.ctrlKey;
        if (ORYX.CONFIG.GRID_ENABLED && !k) {
            e = this.snapToGrid(e)
        } else {
            if (this.vLine) {
                this.vLine.hide()
            }
            if (this.hLine) {
                this.hLine.hide()
            }
        }
        e.x /= this.faktorXY.x;
        e.y /= this.faktorXY.y;
        e.x = Math.max(0, e.x);
        e.y = Math.max(0, e.y);
        var g = this.facade.getCanvas();
        e.x = Math.min(g.bounds.width() - this.dragBounds.width(), e.x);
        e.y = Math.min(g.bounds.height() - this.dragBounds.height(), e.y);
        this.dragBounds.moveTo(e);
        this.resizeRectangle(this.dragBounds);
        this.isAttachingAllowed = false;
        var f = this.facade.eventCoordinates(b);
        var a = 1;
        if (!isNaN(screen.logicalXDPI) && !isNaN(screen.systemXDPI)) {
            var d = navigator.userAgent;
            if (d.indexOf("MSIE") >= 0) {
                var m = Math.round((screen.deviceXDPI / screen.logicalXDPI) * 100);
                if (m !== 100) {
                    a = m / 100
                }
            }
        }
        if (a !== 1) {
            f.x = f.x / a;
            f.y = f.y / a
        }
        var l = $A(this.facade.getCanvas().getAbstractShapesAtPosition(f));
        var h = this.toMoveShapes.length == 1 && this.toMoveShapes[0] instanceof ORYX.Core.Node && this.toMoveShapes[0].dockers.length > 0;
        h = h && l.length != 1;
        if (!h && l.length === this._currentUnderlyingNodes.length && l.all(function (o, c) {
            return this._currentUnderlyingNodes[c] === o
        }.bind(this))) {
            return
        } else {
            if (this._onlyEdges) {
                this.isAddingAllowed = true;
                this.containmentParentNode = this.facade.getCanvas()
            } else {
                var n = {event: b, underlyingNodes: l, checkIfAttachable: h};
                this.checkRules(n)
            }
        }
        this._currentUnderlyingNodes = l.reverse();
        if (this.isAttachingAllowed) {
            this.facade.raiseEvent({
                type: ORYX.CONFIG.EVENT_HIGHLIGHT_SHOW,
                highlightId: "dragdropresize.attached",
                elements: [this.containmentParentNode],
                style: ORYX.CONFIG.SELECTION_HIGHLIGHT_STYLE_RECTANGLE,
                color: ORYX.CONFIG.SELECTION_VALID_COLOR
            })
        } else {
            this.facade.raiseEvent({type: ORYX.CONFIG.EVENT_HIGHLIGHT_HIDE, highlightId: "dragdropresize.attached"})
        }
        if (!this.isAttachingAllowed) {
            if (this.isAddingAllowed) {
                this.facade.raiseEvent({
                    type: ORYX.CONFIG.EVENT_HIGHLIGHT_SHOW,
                    highlightId: "dragdropresize.contain",
                    elements: [this.containmentParentNode],
                    color: ORYX.CONFIG.SELECTION_VALID_COLOR
                })
            } else {
                this.facade.raiseEvent({
                    type: ORYX.CONFIG.EVENT_HIGHLIGHT_SHOW,
                    highlightId: "dragdropresize.contain",
                    elements: [this.containmentParentNode],
                    color: ORYX.CONFIG.SELECTION_INVALID_COLOR
                })
            }
        } else {
            this.facade.raiseEvent({type: ORYX.CONFIG.EVENT_HIGHLIGHT_HIDE, highlightId: "dragdropresize.contain"})
        }
        return
    }, checkRules: function (d) {
        var f = d.event;
        var c = d.underlyingNodes;
        var e = d.checkIfAttachable;
        var b = d.noEdges;
        this.containmentParentNode = c.reverse().find((function (g) {
            return (g instanceof ORYX.Core.Canvas) || (((g instanceof ORYX.Core.Node) || ((g instanceof ORYX.Core.Edge) && !b)) && (!(this.currentShapes.member(g) || this.currentShapes.any(function (h) {
                return (h.children.length > 0 && h.getChildNodes(true).member(g))
            }))))
        }).bind(this));
        if (e) {
            this.isAttachingAllowed = this.facade.getRules().canConnect({
                sourceShape: this.containmentParentNode,
                edgeShape: this.toMoveShapes[0],
                targetShape: this.toMoveShapes[0]
            });
            if (this.isAttachingAllowed) {
                var a = this.facade.eventCoordinates(f);
                this.isAttachingAllowed = this.containmentParentNode.isPointOverOffset(a.x, a.y)
            }
        }
        if (!this.isAttachingAllowed) {
            this.isAddingAllowed = this.toMoveShapes.all((function (g) {
                if (g instanceof ORYX.Core.Edge || g instanceof ORYX.Core.Controls.Docker || this.containmentParentNode === g.parent) {
                    return true
                } else {
                    if (this.containmentParentNode !== g) {
                        if (!(this.containmentParentNode instanceof ORYX.Core.Edge) || !b) {
                            if (this.facade.getRules().canContain({
                                containingShape: this.containmentParentNode,
                                containedShape: g
                            })) {
                                return true
                            }
                        }
                    }
                }
                return false
            }).bind(this))
        }
        if (!this.isAttachingAllowed && !this.isAddingAllowed && (this.containmentParentNode instanceof ORYX.Core.Edge)) {
            d.noEdges = true;
            d.underlyingNodes.reverse();
            this.checkRules(d)
        }
    }, refreshSelectedShapes: function () {
        if (!this.dragBounds) {
            return
        }
        var d = this.dragBounds.upperLeft();
        var b = this.oldDragBounds.upperLeft();
        var c = {x: d.x - b.x, y: d.y - b.y};
        var a = [new ORYX.Core.Command.Move(this.toMoveShapes, c, this.containmentParentNode, this.currentShapes, this)];
        if (this._undockedEdgesCommand instanceof ORYX.Core.Command) {
            a.unshift(this._undockedEdgesCommand)
        }
        this.facade.executeCommands(a);
        if (this.dragBounds) {
            this.oldDragBounds = this.dragBounds.clone()
        }
    }, onResize: function (a) {
        if (!this.dragBounds) {
            return
        }
        this.dragBounds = a;
        this.isResizing = true;
        this.resizeRectangle(this.dragBounds)
    }, onResizeStart: function () {
        this.facade.raiseEvent({type: ORYX.CONFIG.EVENT_RESIZE_START})
    }, onResizeEnd: function () {
        if (!(this.currentShapes instanceof Array) || this.currentShapes.length <= 0) {
            return
        }
        if (this.isResizing) {
            var a = ORYX.Core.Command.extend({
                construct: function (f, h, g) {
                    this.shape = f;
                    this.oldBounds = f.bounds.clone();
                    this.newBounds = h;
                    this.plugin = g
                }, execute: function () {
                    this.shape.bounds.set(this.newBounds.a, this.newBounds.b);
                    this.update(this.getOffset(this.oldBounds, this.newBounds))
                }, rollback: function () {
                    this.shape.bounds.set(this.oldBounds.a, this.oldBounds.b);
                    this.update(this.getOffset(this.newBounds, this.oldBounds))
                }, getOffset: function (g, f) {
                    return {x: f.a.x - g.a.x, y: f.a.y - g.a.y, xs: f.width() / g.width(), ys: f.height() / g.height()}
                }, update: function (g) {
                    this.shape.getLabels().each(function (h) {
                        h.changed()
                    });
                    var f = [].concat(this.shape.getIncomingShapes()).concat(this.shape.getOutgoingShapes()).findAll(function (h) {
                        return h instanceof ORYX.Core.Edge
                    }.bind(this));
                    this.plugin.layoutEdges(this.shape, f, g);
                    this.plugin.facade.setSelection([this.shape]);
                    this.plugin.facade.getCanvas().update();
                    this.plugin.facade.updateSelection()
                }
            });
            var c = this.dragBounds.clone();
            var b = this.currentShapes[0];
            if (b.parent) {
                var e = b.parent.absoluteXY();
                c.moveBy(-e.x, -e.y)
            }
            var d = new a(b, c, this);
            this.facade.executeCommands([d]);
            this.isResizing = false;
            this.facade.raiseEvent({type: ORYX.CONFIG.EVENT_RESIZE_END})
        }
    }, beforeDrag: function () {
        var a = ORYX.Core.Command.extend({
            construct: function (b) {
                this.dockers = b.collect(function (c) {
                    return c instanceof ORYX.Core.Controls.Docker ? {
                        docker: c,
                        dockedShape: c.getDockedShape(),
                        refPoint: c.referencePoint
                    } : undefined
                }).compact()
            }, execute: function () {
                this.dockers.each(function (b) {
                    b.docker.setDockedShape(undefined)
                })
            }, rollback: function () {
                this.dockers.each(function (b) {
                    b.docker.setDockedShape(b.dockedShape);
                    b.docker.setReferencePoint(b.refPoint)
                })
            }
        });
        this._undockedEdgesCommand = new a(this.toMoveShapes);
        this._undockedEdgesCommand.execute()
    }, hideAllLabels: function (a) {
        a.getLabels().each(function (b) {
            b.hide()
        });
        a.getAllDockedShapes().each(function (b) {
            var c = b.getLabels();
            if (c.length > 0) {
                c.each(function (d) {
                    d.hide()
                })
            }
        });
        a.getChildren().each((function (b) {
            if (b instanceof ORYX.Core.Shape) {
                this.hideAllLabels(b)
            }
        }).bind(this))
    }, afterDrag: function () {
    }, showAllLabels: function (a) {
        for (var d = 0; d < a.length; d++) {
            var b = a[d];
            b.show()
        }
        var f = a.getAllDockedShapes();
        for (var d = 0; d < f.length; d++) {
            var c = f[d];
            var g = c.getLabels();
            if (g.length > 0) {
                g.each(function (h) {
                    h.show()
                })
            }
        }
        for (var d = 0; d < a.children.length; d++) {
            var e = a.children[d];
            if (e instanceof ORYX.Core.Shape) {
                this.showAllLabels(e)
            }
        }
    }, onSelectionChanged: function (b) {
        var d = b.elements;
        this.dragEnable = false;
        this.dragIntialized = false;
        this.resizerSE.hide();
        this.resizerNW.hide();
        if (!d || d.length == 0) {
            this.selectedRect.hide();
            this.currentShapes = [];
            this.toMoveShapes = [];
            this.dragBounds = undefined;
            this.oldDragBounds = undefined
        } else {
            this.currentShapes = d;
            var e = this.facade.getCanvas().getShapesWithSharedParent(d);
            this.toMoveShapes = e;
            this.toMoveShapes = this.toMoveShapes.findAll(function (f) {
                return f instanceof ORYX.Core.Node && (f.dockers.length === 0 || !d.member(f.dockers.first().getDockedShape()))
            });
            d.each((function (f) {
                if (!(f instanceof ORYX.Core.Edge)) {
                    return
                }
                var h = f.getDockers();
                var k = d.member(h.first().getDockedShape());
                var g = d.member(h.last().getDockedShape());
                if (!k && !g) {
                    var l = !h.first().getDockedShape() && !h.last().getDockedShape();
                    if (l) {
                        this.toMoveShapes = this.toMoveShapes.concat(h)
                    }
                }
                if (f.dockers.length > 2 && k && g) {
                    this.toMoveShapes = this.toMoveShapes.concat(h.findAll(function (n, m) {
                        return m > 0 && m < h.length - 1
                    }))
                }
            }).bind(this));
            var c = undefined;
            this.toMoveShapes.each(function (g) {
                var f = g;
                if (g instanceof ORYX.Core.Controls.Docker) {
                    f = g.parent
                }
                if (!c) {
                    c = f.absoluteBounds()
                } else {
                    c.include(f.absoluteBounds())
                }
            }.bind(this));
            if (!c) {
                d.each(function (f) {
                    if (!c) {
                        c = f.absoluteBounds()
                    } else {
                        c.include(f.absoluteBounds())
                    }
                })
            }
            this.dragBounds = c;
            this.oldDragBounds = c.clone();
            this.resizeRectangle(c);
            this.selectedRect.show();
            if (d.length == 1 && d[0].isResizable) {
                var a = d[0].getStencil().fixedAspectRatio() ? d[0].bounds.width() / d[0].bounds.height() : undefined;
                this.resizerSE.setBounds(this.dragBounds, d[0].minimumSize, d[0].maximumSize, a);
                this.resizerSE.show();
                this.resizerNW.setBounds(this.dragBounds, d[0].minimumSize, d[0].maximumSize, a);
                this.resizerNW.show()
            } else {
                this.resizerSE.setBounds(undefined);
                this.resizerNW.setBounds(undefined)
            }
            if (ORYX.CONFIG.GRID_ENABLED) {
                this.distPoints = [];
                if (this.distPointTimeout) {
                    window.clearTimeout(this.distPointTimeout)
                }
                this.distPointTimeout = window.setTimeout(function () {
                    var f = this.facade.getCanvas().getChildShapes(true).findAll(function (h) {
                        var g = h.parent;
                        while (g) {
                            if (d.member(g)) {
                                return false
                            }
                            g = g.parent
                        }
                        return true
                    });
                    f.each((function (l) {
                        if (!(l instanceof ORYX.Core.Edge)) {
                            var h = l.absoluteXY();
                            var k = l.bounds.width();
                            var g = l.bounds.height();
                            this.distPoints.push({
                                ul: {x: h.x, y: h.y},
                                c: {x: h.x + (k / 2), y: h.y + (g / 2)},
                                lr: {x: h.x + k, y: h.y + g}
                            })
                        }
                    }).bind(this))
                }.bind(this), 10)
            }
        }
    }, snapToGrid: function (h) {
        var a = this.dragBounds;
        var p = {};
        var o = 6;
        var m = 10;
        var q = 6;
        var b = this.vLine ? this.vLine.getScale() : 1;
        var l = {x: (h.x / b), y: (h.y / b)};
        var n = {x: (h.x / b) + (a.width() / 2), y: (h.y / b) + (a.height() / 2)};
        var g = {x: (h.x / b) + (a.width()), y: (h.y / b) + (a.height())};
        var f, d;
        var k, e;
        this.distPoints.each(function (s) {
            var c, u, t, r;
            if (Math.abs(s.c.x - n.x) < m) {
                c = s.c.x - n.x;
                t = s.c.x
            }
            if (Math.abs(s.c.y - n.y) < m) {
                u = s.c.y - n.y;
                r = s.c.y
            }
            if (c !== undefined) {
                f = f === undefined ? c : (Math.abs(c) < Math.abs(f) ? c : f);
                if (f === c) {
                    k = t
                }
            }
            if (u !== undefined) {
                d = d === undefined ? u : (Math.abs(u) < Math.abs(d) ? u : d);
                if (d === u) {
                    e = r
                }
            }
        });
        if (f !== undefined) {
            l.x += f;
            l.x *= b;
            if (this.vLine && k) {
                this.vLine.update(k)
            }
        } else {
            l.x = (h.x - (h.x % (ORYX.CONFIG.GRID_DISTANCE / 2)));
            if (this.vLine) {
                this.vLine.hide()
            }
        }
        if (d !== undefined) {
            l.y += d;
            l.y *= b;
            if (this.hLine && e) {
                this.hLine.update(e)
            }
        } else {
            l.y = (h.y - (h.y % (ORYX.CONFIG.GRID_DISTANCE / 2)));
            if (this.hLine) {
                this.hLine.hide()
            }
        }
        return l
    }, showGridLine: function () {
    }, resizeRectangle: function (a) {
        this.selectedRect.resize(a)
    }
});
ORYX.Plugins.SelectedRect = Clazz.extend({
    construct: function (a) {
        this.parentId = a;
        this.node = ORYX.Editor.graft("http://www.w3.org/2000/svg", $(a), ["g"]);
        this.dashedArea = ORYX.Editor.graft("http://www.w3.org/2000/svg", this.node, ["rect", {
            x: 0,
            y: 0,
            "stroke-width": 1,
            stroke: "#777777",
            fill: "none",
            "stroke-dasharray": "2,2",
            "pointer-events": "none"
        }]);
        this.hide()
    }, hide: function () {
        this.node.setAttributeNS(null, "display", "none")
    }, show: function () {
        this.node.setAttributeNS(null, "display", "")
    }, resize: function (a) {
        var c = a.upperLeft();
        var b = ORYX.CONFIG.SELECTED_AREA_PADDING;
        this.dashedArea.setAttributeNS(null, "width", a.width() + 2 * b);
        this.dashedArea.setAttributeNS(null, "height", a.height() + 2 * b);
        this.node.setAttributeNS(null, "transform", "translate(" + (c.x - b) + ", " + (c.y - b) + ")")
    }
});
ORYX.Plugins.GridLine = Clazz.extend({
    construct: function (b, a) {
        if (ORYX.Plugins.GridLine.DIR_HORIZONTAL !== a && ORYX.Plugins.GridLine.DIR_VERTICAL !== a) {
            a = ORYX.Plugins.GridLine.DIR_HORIZONTAL
        }
        this.parent = $(b);
        this.direction = a;
        this.node = ORYX.Editor.graft("http://www.w3.org/2000/svg", this.parent, ["g"]);
        this.line = ORYX.Editor.graft("http://www.w3.org/2000/svg", this.node, ["path", {
            "stroke-width": 1,
            stroke: "silver",
            fill: "none",
            "stroke-dasharray": "5,5",
            "pointer-events": "none"
        }]);
        this.hide()
    }, hide: function () {
        this.node.setAttributeNS(null, "display", "none")
    }, show: function () {
        this.node.setAttributeNS(null, "display", "")
    }, getScale: function () {
        try {
            return this.parent.parentNode.transform.baseVal.getItem(0).matrix.a
        } catch (a) {
            return 1
        }
    }, update: function (e) {
        if (this.direction === ORYX.Plugins.GridLine.DIR_HORIZONTAL) {
            var d = e instanceof Object ? e.y : e;
            var c = this.parent.parentNode.parentNode.width.baseVal.value / this.getScale();
            this.line.setAttributeNS(null, "d", "M 0 " + d + " L " + c + " " + d)
        } else {
            var a = e instanceof Object ? e.x : e;
            var b = this.parent.parentNode.parentNode.height.baseVal.value / this.getScale();
            this.line.setAttributeNS(null, "d", "M" + a + " 0 L " + a + " " + b)
        }
        this.show()
    }
});
ORYX.Plugins.GridLine.DIR_HORIZONTAL = "hor";
ORYX.Plugins.GridLine.DIR_VERTICAL = "ver";
ORYX.Plugins.Resizer = Clazz.extend({
    construct: function (c, a, b) {
        this.parentId = c;
        this.orientation = a;
        this.facade = b;
        this.node = ORYX.Editor.graft("http://www.w3.org/1999/xhtml", $("canvasSection"), ["div", {
            "class": "resizer_" + this.orientation,
            style: "left:0px; top:0px;position:absolute;"
        }]);
        this.node.addEventListener(ORYX.CONFIG.EVENT_MOUSEDOWN, this.handleMouseDown.bind(this), true);
        document.documentElement.addEventListener(ORYX.CONFIG.EVENT_MOUSEUP, this.handleMouseUp.bind(this), true);
        document.documentElement.addEventListener(ORYX.CONFIG.EVENT_MOUSEMOVE, this.handleMouseMove.bind(this), false);
        this.dragEnable = false;
        this.offSetPosition = {x: 0, y: 0};
        this.bounds = undefined;
        this.canvasNode = this.facade.getCanvas().node;
        this.minSize = undefined;
        this.maxSize = undefined;
        this.aspectRatio = undefined;
        this.resizeCallbacks = [];
        this.resizeStartCallbacks = [];
        this.resizeEndCallbacks = [];
        this.hide();
        this.scrollNode = this.node.parentNode.parentNode.parentNode
    }, handleMouseDown: function (a) {
        this.dragEnable = true;
        this.offsetScroll = {x: this.scrollNode.scrollLeft, y: this.scrollNode.scrollTop};
        this.offSetPosition = {x: Event.pointerX(a) - this.position.x, y: Event.pointerY(a) - this.position.y};
        this.resizeStartCallbacks.each((function (b) {
            b(this.bounds)
        }).bind(this))
    }, handleMouseUp: function (a) {
        this.dragEnable = false;
        this.containmentParentNode = null;
        this.resizeEndCallbacks.each((function (b) {
            b(this.bounds)
        }).bind(this))
    }, handleMouseMove: function (b) {
        if (!this.dragEnable) {
            return
        }
        if (b.shiftKey || b.ctrlKey) {
            this.aspectRatio = this.bounds.width() / this.bounds.height()
        } else {
            this.aspectRatio = undefined
        }
        var a = {x: Event.pointerX(b) - this.offSetPosition.x, y: Event.pointerY(b) - this.offSetPosition.y};
        a.x -= this.offsetScroll.x - this.scrollNode.scrollLeft;
        a.y -= this.offsetScroll.y - this.scrollNode.scrollTop;
        a.x = Math.min(a.x, this.facade.getCanvas().bounds.width());
        a.y = Math.min(a.y, this.facade.getCanvas().bounds.height());
        var c = {x: a.x - this.position.x, y: a.y - this.position.y};
        if (this.aspectRatio) {
            newAspectRatio = (this.bounds.width() + c.x) / (this.bounds.height() + c.y);
            if (newAspectRatio > this.aspectRatio) {
                c.x = this.aspectRatio * (this.bounds.height() + c.y) - this.bounds.width()
            } else {
                if (newAspectRatio < this.aspectRatio) {
                    c.y = (this.bounds.width() + c.x) / this.aspectRatio - this.bounds.height()
                }
            }
        }
        if (this.orientation === "northwest") {
            if (this.bounds.width() - c.x > this.maxSize.width) {
                c.x = -(this.maxSize.width - this.bounds.width());
                if (this.aspectRatio) {
                    c.y = this.aspectRatio * c.x
                }
            }
            if (this.bounds.width() - c.x < this.minSize.width) {
                c.x = -(this.minSize.width - this.bounds.width());
                if (this.aspectRatio) {
                    c.y = this.aspectRatio * c.x
                }
            }
            if (this.bounds.height() - c.y > this.maxSize.height) {
                c.y = -(this.maxSize.height - this.bounds.height());
                if (this.aspectRatio) {
                    c.x = c.y / this.aspectRatio
                }
            }
            if (this.bounds.height() - c.y < this.minSize.height) {
                c.y = -(this.minSize.height - this.bounds.height());
                if (this.aspectRatio) {
                    c.x = c.y / this.aspectRatio
                }
            }
        } else {
            if (this.bounds.width() + c.x > this.maxSize.width) {
                c.x = this.maxSize.width - this.bounds.width();
                if (this.aspectRatio) {
                    c.y = this.aspectRatio * c.x
                }
            }
            if (this.bounds.width() + c.x < this.minSize.width) {
                c.x = this.minSize.width - this.bounds.width();
                if (this.aspectRatio) {
                    c.y = this.aspectRatio * c.x
                }
            }
            if (this.bounds.height() + c.y > this.maxSize.height) {
                c.y = this.maxSize.height - this.bounds.height();
                if (this.aspectRatio) {
                    c.x = c.y / this.aspectRatio
                }
            }
            if (this.bounds.height() + c.y < this.minSize.height) {
                c.y = this.minSize.height - this.bounds.height();
                if (this.aspectRatio) {
                    c.x = c.y / this.aspectRatio
                }
            }
        }
        if (this.orientation === "northwest") {
            this.bounds.extend({x: -c.x, y: -c.y});
            this.bounds.moveBy(c)
        } else {
            this.bounds.extend(c)
        }
        this.update();
        this.resizeCallbacks.each((function (d) {
            d(this.bounds)
        }).bind(this));
        Event.stop(b)
    }, registerOnResizeStart: function (a) {
        if (!this.resizeStartCallbacks.member(a)) {
            this.resizeStartCallbacks.push(a)
        }
    }, unregisterOnResizeStart: function (a) {
        if (this.resizeStartCallbacks.member(a)) {
            this.resizeStartCallbacks = this.resizeStartCallbacks.without(a)
        }
    }, registerOnResizeEnd: function (a) {
        if (!this.resizeEndCallbacks.member(a)) {
            this.resizeEndCallbacks.push(a)
        }
    }, unregisterOnResizeEnd: function (a) {
        if (this.resizeEndCallbacks.member(a)) {
            this.resizeEndCallbacks = this.resizeEndCallbacks.without(a)
        }
    }, registerOnResize: function (a) {
        if (!this.resizeCallbacks.member(a)) {
            this.resizeCallbacks.push(a)
        }
    }, unregisterOnResize: function (a) {
        if (this.resizeCallbacks.member(a)) {
            this.resizeCallbacks = this.resizeCallbacks.without(a)
        }
    }, hide: function () {
        this.node.style.display = "none"
    }, show: function () {
        if (this.bounds) {
            this.node.style.display = ""
        }
    }, setBounds: function (d, b, a, c) {
        this.bounds = d;
        if (!b) {
            b = {width: ORYX.CONFIG.MINIMUM_SIZE, height: ORYX.CONFIG.MINIMUM_SIZE}
        }
        if (!a) {
            a = {width: ORYX.CONFIG.MAXIMUM_SIZE, height: ORYX.CONFIG.MAXIMUM_SIZE}
        }
        this.minSize = b;
        this.maxSize = a;
        this.aspectRatio = c;
        this.update()
    }, update: function () {
        if (!this.bounds) {
            return
        }
        var d = this.bounds.upperLeft();
        if (this.bounds.width() < this.minSize.width) {
            this.bounds.set(d.x, d.y, d.x + this.minSize.width, d.y + this.bounds.height())
        }
        if (this.bounds.height() < this.minSize.height) {
            this.bounds.set(d.x, d.y, d.x + this.bounds.width(), d.y + this.minSize.height)
        }
        if (this.bounds.width() > this.maxSize.width) {
            this.bounds.set(d.x, d.y, d.x + this.maxSize.width, d.y + this.bounds.height())
        }
        if (this.bounds.height() > this.maxSize.height) {
            this.bounds.set(d.x, d.y, d.x + this.bounds.width(), d.y + this.maxSize.height)
        }
        var g = this.canvasNode.getScreenCTM();
        d.x *= g.a;
        d.y *= g.d;
        var b = 1;
        if (!isNaN(screen.logicalXDPI) && !isNaN(screen.systemXDPI)) {
            var c = navigator.userAgent;
            if (c.indexOf("MSIE") >= 0) {
                var m = Math.round((screen.deviceXDPI / screen.logicalXDPI) * 100);
                if (m !== 100) {
                    b = m / 100
                }
            }
        }
        if (b === 1) {
            d.y = d.y - jQuery("#canvasSection").offset().top + g.f;
            d.x = d.x - jQuery("#canvasSection").offset().left + g.e
        } else {
            var h = jQuery("#canvasSection").offset().left;
            var k = jQuery("#canvasSection").scrollLeft();
            var f = jQuery("#canvasSection").scrollTop();
            var e = g.e - (h * b);
            var l = 0;
            if (e > 10) {
                l = (e / b) - e
            }
            d.y = d.y - (jQuery("#canvasSection").offset().top * b) + ((f * b) - f) + g.f;
            d.x = d.x - (h * b) + l + ((k * b) - k) + g.e
        }
        if (this.orientation === "northwest") {
            d.x -= 13;
            d.y -= 13
        } else {
            d.x += (g.a * this.bounds.width()) + 3;
            d.y += (g.d * this.bounds.height()) + 3
        }
        this.position = d;
        this.node.style.left = this.position.x + "px";
        this.node.style.top = this.position.y + "px"
    }
});
ORYX.Core.Command.Move = ORYX.Core.Command.extend({
    construct: function (b, e, c, a, d) {
        this.moveShapes = b;
        this.selectedShapes = a;
        this.offset = e;
        this.plugin = d;
        this.newParents = b.collect(function (f) {
            return c || f.parent
        });
        this.oldParents = b.collect(function (f) {
            return f.parent
        });
        this.dockedNodes = b.findAll(function (f) {
            return f instanceof ORYX.Core.Node && f.dockers.length == 1
        }).collect(function (f) {
            return {
                docker: f.dockers[0],
                dockedShape: f.dockers[0].getDockedShape(),
                refPoint: f.dockers[0].referencePoint
            }
        })
    }, execute: function () {
        this.dockAllShapes();
        this.move(this.offset);
        this.addShapeToParent(this.newParents);
        this.selectCurrentShapes();
        this.plugin.facade.getCanvas().update();
        this.plugin.facade.updateSelection()
    }, rollback: function () {
        var a = {x: -this.offset.x, y: -this.offset.y};
        this.move(a);
        this.addShapeToParent(this.oldParents);
        this.dockAllShapes(true);
        this.selectCurrentShapes();
        this.plugin.facade.getCanvas().update();
        this.plugin.facade.updateSelection()
    }, move: function (d, a) {
        for (var g = 0; g < this.moveShapes.length; g++) {
            var l = this.moveShapes[g];
            l.bounds.moveBy(d);
            if (l instanceof ORYX.Core.Node) {
                (l.dockers || []).each(function (k) {
                    k.bounds.moveBy(d)
                });
                var e = [].concat(l.getIncomingShapes()).concat(l.getOutgoingShapes()).findAll(function (k) {
                    return k instanceof ORYX.Core.Edge && !this.moveShapes.any(function (m) {
                        return m == k || (m instanceof ORYX.Core.Controls.Docker && m.parent == k)
                    })
                }.bind(this)).findAll(function (k) {
                    return (k.dockers.first().getDockedShape() == l || !this.moveShapes.include(k.dockers.first().getDockedShape())) && (k.dockers.last().getDockedShape() == l || !this.moveShapes.include(k.dockers.last().getDockedShape()))
                }.bind(this));
                this.plugin.layoutEdges(l, e, d);
                var h = [].concat(l.getIncomingShapes()).concat(l.getOutgoingShapes()).findAll(function (k) {
                    return k instanceof ORYX.Core.Edge && k.dockers.first().isDocked() && k.dockers.last().isDocked() && !this.moveShapes.include(k) && !this.moveShapes.any(function (m) {
                        return m == k || (m instanceof ORYX.Core.Controls.Docker && m.parent == k)
                    })
                }.bind(this)).findAll(function (k) {
                    return this.moveShapes.indexOf(k.dockers.first().getDockedShape()) > g || this.moveShapes.indexOf(k.dockers.last().getDockedShape()) > g
                }.bind(this));
                for (var f = 0; f < h.length; f++) {
                    for (var b = 1; b < h[f].dockers.length - 1; b++) {
                        var c = h[f].dockers[b];
                        if (!c.getDockedShape() && !this.moveShapes.include(c)) {
                            c.bounds.moveBy(d)
                        }
                    }
                }
            }
        }
    }, dockAllShapes: function (a) {
        for (var b = 0; b < this.dockedNodes.length; b++) {
            var c = this.dockedNodes[b].docker;
            c.setDockedShape(a ? this.dockedNodes[b].dockedShape : undefined);
            if (c.getDockedShape()) {
                c.setReferencePoint(this.dockedNodes[b].refPoint)
            }
        }
    }, addShapeToParent: function (e) {
        for (var f = 0; f < this.moveShapes.length; f++) {
            var d = this.moveShapes[f];
            if (d instanceof ORYX.Core.Node && d.parent !== e[f]) {
                var g = e[f].absoluteXY();
                var h = d.absoluteXY();
                var c = h.x - g.x;
                var k = h.y - g.y;
                e[f].add(d);
                d.getOutgoingShapes((function (b) {
                    if (b instanceof ORYX.Core.Node && !this.moveShapes.member(b)) {
                        e[f].add(b)
                    }
                }).bind(this));
                if (d instanceof ORYX.Core.Node && d.dockers.length == 1) {
                    var a = d.bounds;
                    c += a.width() / 2;
                    k += a.height() / 2;
                    d.dockers.first().bounds.centerMoveTo(c, k)
                } else {
                    d.bounds.moveTo(c, k)
                }
            }
        }
    }, selectCurrentShapes: function () {
        this.plugin.facade.setSelection(this.selectedShapes)
    }
});
if (!ORYX.Plugins) {
    ORYX.Plugins = new Object()
}
ORYX.Plugins.DragDocker = Clazz.extend({
    construct: function (a) {
        this.facade = a;
        this.VALIDCOLOR = ORYX.CONFIG.SELECTION_VALID_COLOR;
        this.INVALIDCOLOR = ORYX.CONFIG.SELECTION_INVALID_COLOR;
        this.shapeSelection = undefined;
        this.docker = undefined;
        this.dockerParent = undefined;
        this.dockerSource = undefined;
        this.dockerTarget = undefined;
        this.lastUIObj = undefined;
        this.isStartDocker = undefined;
        this.isEndDocker = undefined;
        this.undockTreshold = 10;
        this.initialDockerPosition = undefined;
        this.outerDockerNotMoved = undefined;
        this.isValid = false;
        this.facade.registerOnEvent(ORYX.CONFIG.EVENT_MOUSEDOWN, this.handleMouseDown.bind(this));
        this.facade.registerOnEvent(ORYX.CONFIG.EVENT_DOCKERDRAG, this.handleDockerDrag.bind(this));
        this.facade.registerOnEvent(ORYX.CONFIG.EVENT_MOUSEOVER, this.handleMouseOver.bind(this));
        this.facade.registerOnEvent(ORYX.CONFIG.EVENT_MOUSEOUT, this.handleMouseOut.bind(this))
    }, handleMouseOut: function (b, a) {
        if (!this.docker && a instanceof ORYX.Core.Controls.Docker) {
            a.hide()
        } else {
            if (!this.docker && a instanceof ORYX.Core.Edge) {
                a.dockers.each(function (c) {
                    c.hide()
                })
            }
        }
    }, handleMouseOver: function (b, a) {
        if (!this.docker && a instanceof ORYX.Core.Controls.Docker) {
            a.show()
        } else {
            if (!this.docker && a instanceof ORYX.Core.Edge) {
                a.dockers.each(function (c) {
                    c.show()
                })
            }
        }
    }, handleDockerDrag: function (b, a) {
        this.handleMouseDown(b.uiEvent, a)
    }, handleMouseDown: function (g, f) {
        if (f instanceof ORYX.Core.Controls.Docker && f.isMovable) {
            this.shapeSelection = this.facade.getSelection();
            this.facade.setSelection();
            this.docker = f;
            this.initialDockerPosition = this.docker.bounds.center();
            this.outerDockerNotMoved = false;
            this.dockerParent = f.parent;
            this._commandArg = {
                docker: f,
                dockedShape: f.getDockedShape(),
                refPoint: f.referencePoint || f.bounds.center()
            };
            this.docker.show();
            if (f.parent instanceof ORYX.Core.Edge && (f.parent.dockers.first() == f || f.parent.dockers.last() == f)) {
                if (f.parent.dockers.first() == f && f.parent.dockers.last().getDockedShape()) {
                    this.dockerTarget = f.parent.dockers.last().getDockedShape()
                } else {
                    if (f.parent.dockers.last() == f && f.parent.dockers.first().getDockedShape()) {
                        this.dockerSource = f.parent.dockers.first().getDockedShape()
                    }
                }
            } else {
                this.dockerSource = undefined;
                this.dockerTarget = undefined
            }
            this.isStartDocker = this.docker.parent.dockers.first() === this.docker;
            this.isEndDocker = this.docker.parent.dockers.last() === this.docker;
            this.facade.getCanvas().add(this.docker.parent);
            this.docker.parent.getLabels().each(function (h) {
                h.hide()
            });
            var c = this.facade.eventCoordinates(g);
            var e = 1;
            if (!isNaN(screen.logicalXDPI) && !isNaN(screen.systemXDPI)) {
                var a = navigator.userAgent;
                if (a.indexOf("MSIE") >= 0) {
                    var d = Math.round((screen.deviceXDPI / screen.logicalXDPI) * 100);
                    if (d !== 100) {
                        e = d / 100
                    }
                }
            }
            if (e !== 1) {
                c.x = c.x / e;
                c.y = c.y / e
            }
            if ((!this.isStartDocker && !this.isEndDocker) || !this.docker.isDocked()) {
                this.docker.setDockedShape(undefined);
                this.docker.bounds.centerMoveTo(c);
                this.dockerParent._update()
            } else {
                this.outerDockerNotMoved = true
            }
            var b = {movedCallback: this.dockerMoved.bind(this), upCallback: this.dockerMovedFinished.bind(this)};
            this.startEventPos = c;
            ORYX.Core.UIEnableDrag(g, f, b)
        }
    }, dockerMoved: function (u) {
        this.outerDockerNotMoved = false;
        var m = undefined;
        if (this.docker.parent) {
            if (this.isStartDocker || this.isEndDocker) {
                var p = this.facade.eventCoordinates(u);
                var x = 1;
                if (!isNaN(screen.logicalXDPI) && !isNaN(screen.systemXDPI)) {
                    var w = navigator.userAgent;
                    if (w.indexOf("MSIE") >= 0) {
                        var a = Math.round((screen.deviceXDPI / screen.logicalXDPI) * 100);
                        if (a !== 100) {
                            x = a / 100
                        }
                    }
                }
                if (x !== 1) {
                    p.x = p.x / x;
                    p.y = p.y / x
                }
                if (this.docker.isDocked()) {
                    var c = ORYX.Core.Math.getDistancePointToPoint(p, this.initialDockerPosition);
                    if (c < this.undockTreshold) {
                        this.outerDockerNotMoved = true;
                        return
                    }
                    this.docker.setDockedShape(undefined);
                    this.dockerParent._update()
                }
                var t = this.facade.getCanvas().getAbstractShapesAtPosition(p);
                var s = t.pop();
                if (this.docker.parent === s) {
                    s = t.pop()
                }
                if (this.lastUIObj == s) {
                } else {
                    if (s instanceof ORYX.Core.Shape) {
                        if (this.docker.parent instanceof ORYX.Core.Edge) {
                            var v = this.getHighestParentBeforeCanvas(s);
                            if (v instanceof ORYX.Core.Edge && this.docker.parent === v) {
                                this.isValid = false;
                                this.dockerParent._update();
                                return
                            }
                            this.isValid = false;
                            var b = s, d = s;
                            while (!this.isValid && b && !(b instanceof ORYX.Core.Canvas)) {
                                s = b;
                                this.isValid = this.facade.getRules().canConnect({
                                    sourceShape: this.dockerSource ? this.dockerSource : (this.isStartDocker ? s : undefined),
                                    edgeShape: this.docker.parent,
                                    targetShape: this.dockerTarget ? this.dockerTarget : (this.isEndDocker ? s : undefined)
                                });
                                b = b.parent
                            }
                            if (!this.isValid) {
                                s = d
                            }
                        } else {
                            this.isValid = this.facade.getRules().canConnect({
                                sourceShape: s,
                                edgeShape: this.docker.parent,
                                targetShape: this.docker.parent
                            })
                        }
                        if (this.lastUIObj) {
                            this.hideMagnets(this.lastUIObj)
                        }
                        if (this.isValid) {
                            this.showMagnets(s)
                        }
                        this.showHighlight(s, this.isValid ? this.VALIDCOLOR : this.INVALIDCOLOR);
                        this.lastUIObj = s
                    } else {
                        this.hideHighlight();
                        this.lastUIObj ? this.hideMagnets(this.lastUIObj) : null;
                        this.lastUIObj = undefined;
                        this.isValid = false
                    }
                }
                if (this.lastUIObj && this.isValid && !(u.shiftKey || u.ctrlKey)) {
                    m = this.lastUIObj.magnets.find(function (A) {
                        return A.absoluteBounds().isIncluded(p)
                    });
                    if (m) {
                        this.docker.bounds.centerMoveTo(m.absoluteCenterXY())
                    }
                }
            }
        }
        if (!(u.shiftKey || u.ctrlKey) && !m) {
            var o = ORYX.CONFIG.DOCKER_SNAP_OFFSET;
            var k = o + 1;
            var g = o + 1;
            var z = this.docker.bounds.center();
            if (this.docker.parent) {
                this.docker.parent.dockers.each((function (B) {
                    if (this.docker == B) {
                        return
                    }
                    var A = B.referencePoint ? B.getAbsoluteReferencePoint() : B.bounds.center();
                    k = Math.abs(k) > Math.abs(A.x - z.x) ? A.x - z.x : k;
                    g = Math.abs(g) > Math.abs(A.y - z.y) ? A.y - z.y : g
                }).bind(this));
                if (Math.abs(k) < o || Math.abs(g) < o) {
                    k = Math.abs(k) < o ? k : 0;
                    g = Math.abs(g) < o ? g : 0;
                    this.docker.bounds.centerMoveTo(z.x + k, z.y + g)
                } else {
                    var e = this.docker.parent.dockers[Math.max(this.docker.parent.dockers.indexOf(this.docker) - 1, 0)];
                    var r = this.docker.parent.dockers[Math.min(this.docker.parent.dockers.indexOf(this.docker) + 1, this.docker.parent.dockers.length - 1)];
                    if (e && r && e !== this.docker && r !== this.docker) {
                        var f = e.bounds.center();
                        var h = r.bounds.center();
                        var q = this.docker.bounds.center();
                        if (ORYX.Core.Math.isPointInLine(q.x, q.y, f.x, f.y, h.x, h.y, 10)) {
                            var y = (Number(h.y) - Number(f.y)) / (Number(h.x) - Number(f.x));
                            var n = ((f.y - (f.x * y)) - (q.y - (q.x * (-Math.pow(y, -1))))) / ((-Math.pow(y, -1)) - y);
                            var l = (f.y - (f.x * y)) + (y * n);
                            if (isNaN(n) || isNaN(l)) {
                                return
                            }
                            this.docker.bounds.centerMoveTo(n, l)
                        }
                    }
                }
            }
        }
        this.dockerParent._update()
    }, dockerMovedFinished: function (e) {
        this.facade.setSelection(this.shapeSelection);
        this.hideHighlight();
        this.dockerParent.getLabels().each(function (g) {
            g.show()
        });
        if (this.lastUIObj && (this.isStartDocker || this.isEndDocker)) {
            if (this.isValid) {
                this.docker.setDockedShape(this.lastUIObj);
                this.facade.raiseEvent({
                    type: ORYX.CONFIG.EVENT_DRAGDOCKER_DOCKED,
                    docker: this.docker,
                    parent: this.docker.parent,
                    target: this.lastUIObj
                })
            }
            this.hideMagnets(this.lastUIObj)
        }
        this.docker.hide();
        if (this.outerDockerNotMoved) {
            var d = this.facade.eventCoordinates(e);
            var a = this.facade.getCanvas().getAbstractShapesAtPosition(d);
            var b = a.findAll(function (g) {
                return g instanceof ORYX.Core.Node
            });
            a = b.length ? b : a;
            this.facade.setSelection(a)
        } else {
            var c = ORYX.Core.Command.extend({
                construct: function (n, h, g, m, l, k) {
                    this.docker = n;
                    this.index = n.parent.dockers.indexOf(n);
                    this.newPosition = h;
                    this.newDockedShape = m;
                    this.oldPosition = g;
                    this.oldDockedShape = l;
                    this.facade = k;
                    this.index = n.parent.dockers.indexOf(n);
                    this.shape = n.parent
                }, execute: function () {
                    if (!this.docker.parent) {
                        this.docker = this.shape.dockers[this.index]
                    }
                    this.dock(this.newDockedShape, this.newPosition);
                    this.removedDockers = this.shape.removeUnusedDockers();
                    this.facade.updateSelection()
                }, rollback: function () {
                    this.dock(this.oldDockedShape, this.oldPosition);
                    (this.removedDockers || $H({})).each(function (g) {
                        this.shape.add(g.value, Number(g.key));
                        this.shape._update(true)
                    }.bind(this));
                    this.facade.updateSelection()
                }, dock: function (g, h) {
                    this.docker.setDockedShape(undefined);
                    if (g) {
                        this.docker.setDockedShape(g);
                        this.docker.setReferencePoint(h)
                    } else {
                        this.docker.bounds.centerMoveTo(h)
                    }
                    this.facade.getCanvas().update()
                }
            });
            if (this.docker.parent) {
                var f = new c(this.docker, this.docker.getDockedShape() ? this.docker.referencePoint : this.docker.bounds.center(), this._commandArg.refPoint, this.docker.getDockedShape(), this._commandArg.dockedShape, this.facade);
                this.facade.executeCommands([f])
            }
        }
        this.docker = undefined;
        this.dockerParent = undefined;
        this.dockerSource = undefined;
        this.dockerTarget = undefined;
        this.lastUIObj = undefined
    }, hideHighlight: function () {
        this.facade.raiseEvent({type: ORYX.CONFIG.EVENT_HIGHLIGHT_HIDE, highlightId: "validDockedShape"})
    }, showHighlight: function (b, a) {
        this.facade.raiseEvent({
            type: ORYX.CONFIG.EVENT_HIGHLIGHT_SHOW,
            highlightId: "validDockedShape",
            elements: [b],
            color: a
        })
    }, showMagnets: function (a) {
        a.magnets.each(function (b) {
            b.show()
        })
    }, hideMagnets: function (a) {
        a.magnets.each(function (b) {
            b.hide()
        })
    }, getHighestParentBeforeCanvas: function (a) {
        if (!(a instanceof ORYX.Core.Shape)) {
            return undefined
        }
        var b = a.parent;
        while (b && !(b.parent instanceof ORYX.Core.Canvas)) {
            b = b.parent
        }
        return b
    }
});
if (!ORYX.Plugins) {
    ORYX.Plugins = new Object()
}
ORYX.Plugins.AddDocker = Clazz.extend({
    construct: function (a) {
        this.facade = a;
        this.enableAdd = false;
        this.enableRemove = false;
        this.facade.registerOnEvent(ORYX.CONFIG.EVENT_MOUSEDOWN, this.handleMouseDown.bind(this))
    }, setEnableAdd: function (a) {
        this.enableAdd = a;
        if (this.enableAdd) {
            jQuery("#add-bendpoint-button").addClass("pressed")
        } else {
            jQuery("#add-bendpoint-button").removeClass("pressed");
            jQuery("#add-bendpoint-button").blur()
        }
    }, setEnableRemove: function (a) {
        this.enableRemove = a;
        if (this.enableRemove) {
            jQuery("#remove-bendpoint-button").addClass("pressed")
        } else {
            jQuery("#remove-bendpoint-button").removeClass("pressed");
            jQuery("#remove-bendpoint-button").blur()
        }
    }, enabledAdd: function (a) {
        return this.enableAdd
    }, enabledRemove: function () {
        return this.enableRemove
    }, handleMouseDown: function (b, a) {
        if (this.enabledAdd() && a instanceof ORYX.Core.Edge) {
            this.newDockerCommand({edge: a, position: this.facade.eventCoordinates(b)});
            this.setEnableAdd(false)
        } else {
            if (this.enabledRemove() && a instanceof ORYX.Core.Controls.Docker && a.parent instanceof ORYX.Core.Edge) {
                this.newDockerCommand({edge: a.parent, docker: a});
                this.setEnableRemove(false)
            }
        }
        document.body.style.cursor = "default"
    }, newDockerCommand: function (b) {
        if (!b.edge) {
            return
        }
        var a = ORYX.Core.Command.extend({
            construct: function (h, f, e, g, k, d) {
                this.addEnabled = h;
                this.deleteEnabled = f;
                this.edge = e;
                this.docker = g;
                this.pos = k;
                this.facade = d
            }, execute: function () {
                if (this.addEnabled) {
                    if (!this.docker) {
                        this.docker = this.edge.addDocker(this.pos);
                        this.index = this.edge.dockers.indexOf(this.docker)
                    } else {
                        this.edge.add(this.docker, this.index)
                    }
                } else {
                    if (this.deleteEnabled) {
                        this.index = this.edge.dockers.indexOf(this.docker);
                        this.pos = this.docker.bounds.center();
                        this.edge.removeDocker(this.docker)
                    }
                }
                this.edge.getLabels().invoke("show");
                this.facade.getCanvas().update();
                this.facade.updateSelection()
            }, rollback: function () {
                if (this.addEnabled) {
                    if (this.docker instanceof ORYX.Core.Controls.Docker) {
                        this.edge.removeDocker(this.docker)
                    }
                } else {
                    if (this.deleteEnabled) {
                        this.edge.add(this.docker, this.index)
                    }
                }
                this.edge.getLabels().invoke("show");
                this.facade.getCanvas().update();
                this.facade.updateSelection()
            }
        });
        var c = new a(this.enabledAdd(), this.enabledRemove(), b.edge, b.docker, b.position, this.facade);
        this.facade.executeCommands([c])
    }
});
if (!ORYX.Plugins) {
    ORYX.Plugins = new Object()
}
ORYX.Plugins.SelectionFrame = Clazz.extend({
    construct: function (a) {
        this.facade = a;
        this.facade.registerOnEvent(ORYX.CONFIG.EVENT_MOUSEDOWN, this.handleMouseDown.bind(this));
        document.documentElement.addEventListener(ORYX.CONFIG.EVENT_MOUSEUP, this.handleMouseUp.bind(this), true);
        this.position = {x: 0, y: 0};
        this.size = {width: 0, height: 0};
        this.offsetPosition = {x: 0, y: 0};
        this.moveCallback = undefined;
        this.offsetScroll = {x: 0, y: 0};
        this.node = ORYX.Editor.graft("http://www.w3.org/1999/xhtml", $("canvasSection"), ["div", {"class": "Oryx_SelectionFrame"}]);
        this.hide()
    }, handleMouseDown: function (d, c) {
        if (c instanceof ORYX.Core.Canvas) {
            var e = c.rootNode.parentNode.parentNode;
            var b = this.facade.getCanvas().node.getScreenCTM();
            this.offsetPosition = {x: b.e, y: b.f};
            this.setPos({
                x: Event.pointerX(d) - jQuery("#canvasSection").offset().left,
                y: Event.pointerY(d) - jQuery("#canvasSection").offset().top + 5
            });
            this.resize({width: 0, height: 0});
            this.moveCallback = this.handleMouseMove.bind(this);
            document.documentElement.addEventListener(ORYX.CONFIG.EVENT_MOUSEMOVE, this.moveCallback, false);
            this.offsetScroll = {x: e.scrollLeft, y: e.scrollTop};
            this.show()
        }
        Event.stop(d)
    }, handleMouseUp: function (e) {
        if (this.moveCallback) {
            this.hide();
            document.documentElement.removeEventListener(ORYX.CONFIG.EVENT_MOUSEMOVE, this.moveCallback, false);
            this.moveCallback = undefined;
            var g = this.facade.getCanvas().node.getScreenCTM();
            var m = {
                x: this.size.width > 0 ? this.position.x : this.position.x + this.size.width,
                y: this.size.height > 0 ? this.position.y : this.position.y + this.size.height
            };
            var l = {x: m.x + Math.abs(this.size.width), y: m.y + Math.abs(this.size.height)};
            var d = 1;
            if (!isNaN(screen.logicalXDPI) && !isNaN(screen.systemXDPI)) {
                var f = navigator.userAgent;
                if (f.indexOf("MSIE") >= 0) {
                    var q = Math.round((screen.deviceXDPI / screen.logicalXDPI) * 100);
                    if (q !== 100) {
                        d = q / 100
                    }
                }
            }
            if (d === 1) {
                m.x = m.x - (g.e - jQuery("#canvasSection").offset().left);
                m.y = m.y - (g.f - jQuery("#canvasSection").offset().top);
                l.x = l.x - (g.e - jQuery("#canvasSection").offset().left);
                l.y = l.y - (g.f - jQuery("#canvasSection").offset().top)
            } else {
                var n = jQuery("#canvasSection").offset().left;
                var o = jQuery("#canvasSection").scrollLeft();
                var k = jQuery("#canvasSection").scrollTop();
                var h = m.e - (n * d);
                var p = 0;
                if (h > 10) {
                    p = (h / d) - h
                }
                m.x = m.x - (g.e - (n * d) + p + ((o * d) - o));
                m.y = m.y - (g.f - (jQuery("#canvasSection").offset().top * d) + ((k * d) - k));
                l.x = l.x - (g.e - (n * d) + p + ((o * d) - o));
                l.y = l.y - (g.f - (jQuery("#canvasSection").offset().top * d) + ((k * d) - k))
            }
            m.x /= g.a;
            m.y /= g.d;
            l.x /= g.a;
            l.y /= g.d;
            var c = this.facade.getCanvas().getChildShapes(true).findAll(function (b) {
                var a = b.absoluteBounds();
                var s = a.upperLeft();
                var r = a.lowerRight();
                if (s.x > m.x && s.y > m.y && r.x < l.x && r.y < l.y) {
                    return true
                }
                return false
            });
            this.facade.setSelection(c)
        }
    }, handleMouseMove: function (b) {
        var a = {
            width: Event.pointerX(b) - this.position.x - jQuery("#canvasSection").offset().left,
            height: Event.pointerY(b) - this.position.y - jQuery("#canvasSection").offset().top + 5
        };
        var c = this.facade.getCanvas().rootNode.parentNode.parentNode;
        a.width -= this.offsetScroll.x - c.scrollLeft;
        a.height -= this.offsetScroll.y - c.scrollTop;
        this.resize(a);
        Event.stop(b)
    }, hide: function () {
        this.node.style.display = "none"
    }, show: function () {
        this.node.style.display = ""
    }, setPos: function (a) {
        this.node.style.top = a.y + "px";
        this.node.style.left = a.x + "px";
        this.position = a
    }, resize: function (a) {
        this.setPos(this.position);
        this.size = Object.clone(a);
        if (a.width < 0) {
            this.node.style.left = (this.position.x + a.width) + "px";
            a.width = -a.width
        }
        if (a.height < 0) {
            this.node.style.top = (this.position.y + a.height) + "px";
            a.height = -a.height
        }
        this.node.style.width = a.width + "px";
        this.node.style.height = a.height + "px"
    }
});
if (!ORYX.Plugins) {
    ORYX.Plugins = new Object()
}
ORYX.Plugins.ShapeHighlighting = Clazz.extend({
    construct: function (a) {
        this.parentNode = a.getCanvas().getSvgContainer();
        this.node = ORYX.Editor.graft("http://www.w3.org/2000/svg", this.parentNode, ["g"]);
        this.highlightNodes = {};
        a.registerOnEvent(ORYX.CONFIG.EVENT_HIGHLIGHT_SHOW, this.setHighlight.bind(this));
        a.registerOnEvent(ORYX.CONFIG.EVENT_HIGHLIGHT_HIDE, this.hideHighlight.bind(this))
    }, setHighlight: function (a) {
        if (a && a.highlightId) {
            var b = this.highlightNodes[a.highlightId];
            if (!b) {
                b = ORYX.Editor.graft("http://www.w3.org/2000/svg", this.node, ["path", {
                    "stroke-width": 2,
                    fill: "none"
                }]);
                this.highlightNodes[a.highlightId] = b
            }
            if (a.elements && a.elements.length > 0) {
                this.setAttributesByStyle(b, a);
                this.show(b)
            } else {
                this.hide(b)
            }
        }
    }, hideHighlight: function (a) {
        if (a && a.highlightId && this.highlightNodes[a.highlightId]) {
            this.hide(this.highlightNodes[a.highlightId])
        }
    }, hide: function (a) {
        a.setAttributeNS(null, "display", "none")
    }, show: function (a) {
        a.setAttributeNS(null, "display", "")
    }, setAttributesByStyle: function (b, a) {
        if (a.style && a.style == ORYX.CONFIG.SELECTION_HIGHLIGHT_STYLE_RECTANGLE) {
            var d = a.elements[0].absoluteBounds();
            var c = a.strokewidth ? a.strokewidth : ORYX.CONFIG.BORDER_OFFSET;
            b.setAttributeNS(null, "d", this.getPathRectangle(d.a, d.b, c));
            b.setAttributeNS(null, "stroke", a.color ? a.color : ORYX.CONFIG.SELECTION_HIGHLIGHT_COLOR);
            b.setAttributeNS(null, "stroke-opacity", a.opacity ? a.opacity : 0.2);
            b.setAttributeNS(null, "stroke-width", c)
        } else {
            if (a.elements.length == 1 && a.elements[0] instanceof ORYX.Core.Edge && a.highlightId != "selection") {
                var e = this.getPathEdge(a.elements[0].dockers);
                if (e && e.length > 0) {
                    b.setAttributeNS(null, "d", e)
                }
                b.setAttributeNS(null, "stroke", a.color ? a.color : ORYX.CONFIG.SELECTION_HIGHLIGHT_COLOR);
                b.setAttributeNS(null, "stroke-opacity", a.opacity ? a.opacity : 0.2);
                b.setAttributeNS(null, "stroke-width", ORYX.CONFIG.OFFSET_EDGE_BOUNDS)
            } else {
                var e = this.getPathByElements(a.elements);
                if (e && e.length > 0) {
                    b.setAttributeNS(null, "d", e)
                }
                b.setAttributeNS(null, "stroke", a.color ? a.color : ORYX.CONFIG.SELECTION_HIGHLIGHT_COLOR);
                b.setAttributeNS(null, "stroke-opacity", a.opacity ? a.opacity : 1);
                b.setAttributeNS(null, "stroke-width", a.strokewidth ? a.strokewidth : 2)
            }
        }
    }, getPathByElements: function (a) {
        if (!a || a.length <= 0) {
            return undefined
        }
        var c = ORYX.CONFIG.SELECTED_AREA_PADDING;
        var b = "";
        a.each((function (f) {
            if (!f) {
                return
            }
            var g = f.absoluteBounds();
            g.widen(c);
            var e = g.upperLeft();
            var d = g.lowerRight();
            b = b + this.getPath(e, d)
        }).bind(this));
        return b
    }, getPath: function (d, c) {
        return this.getPathCorners(d, c)
    }, getPathCorners: function (d, c) {
        var e = ORYX.CONFIG.SELECTION_HIGHLIGHT_SIZE;
        var f = "";
        f = f + "M" + d.x + " " + (d.y + e) + " l0 -" + e + " l" + e + " 0 ";
        f = f + "M" + d.x + " " + (c.y - e) + " l0 " + e + " l" + e + " 0 ";
        f = f + "M" + c.x + " " + (c.y - e) + " l0 " + e + " l-" + e + " 0 ";
        f = f + "M" + c.x + " " + (d.y + e) + " l0 -" + e + " l-" + e + " 0 ";
        return f
    }, getPathRectangle: function (d, c, h) {
        var e = ORYX.CONFIG.SELECTION_HIGHLIGHT_SIZE;
        var f = "";
        var g = h / 2;
        f = f + "M" + (d.x + g) + " " + (d.y);
        f = f + " L" + (d.x + g) + " " + (c.y - g);
        f = f + " L" + (c.x - g) + " " + (c.y - g);
        f = f + " L" + (c.x - g) + " " + (d.y + g);
        f = f + " L" + (d.x + g) + " " + (d.y + g);
        return f
    }, getPathEdge: function (a) {
        var b = a.length;
        var c = "M" + a[0].bounds.center().x + " " + a[0].bounds.center().y;
        for (i = 1; i < b; i++) {
            var d = a[i].bounds.center();
            c = c + " L" + d.x + " " + d.y
        }
        return c
    }
});
ORYX.Plugins.HighlightingSelectedShapes = Clazz.extend({
    construct: function (a) {
        this.facade = a;
        this.opacityFull = 0.9;
        this.opacityLow = 0.4
    }, onSelectionChanged: function (a) {
        if (a.elements && a.elements.length > 1) {
            this.facade.raiseEvent({
                type: ORYX.CONFIG.EVENT_HIGHLIGHT_SHOW,
                highlightId: "selection",
                elements: a.elements.without(a.subSelection),
                color: ORYX.CONFIG.SELECTION_HIGHLIGHT_COLOR,
                opacity: !a.subSelection ? this.opacityFull : this.opacityLow
            });
            if (a.subSelection) {
                this.facade.raiseEvent({
                    type: ORYX.CONFIG.EVENT_HIGHLIGHT_SHOW,
                    highlightId: "subselection",
                    elements: [a.subSelection],
                    color: ORYX.CONFIG.SELECTION_HIGHLIGHT_COLOR,
                    opacity: this.opacityFull
                })
            } else {
                this.facade.raiseEvent({type: ORYX.CONFIG.EVENT_HIGHLIGHT_HIDE, highlightId: "subselection"})
            }
        } else {
            this.facade.raiseEvent({type: ORYX.CONFIG.EVENT_HIGHLIGHT_HIDE, highlightId: "selection"});
            this.facade.raiseEvent({type: ORYX.CONFIG.EVENT_HIGHLIGHT_HIDE, highlightId: "subselection"})
        }
    }
});
if (!ORYX.Plugins) {
    ORYX.Plugins = new Object()
}
ORYX.Plugins.Overlay = Clazz.extend({
    facade: undefined, styleNode: undefined, construct: function (a) {
        this.facade = a;
        this.changes = [];
        this.facade.registerOnEvent(ORYX.CONFIG.EVENT_OVERLAY_SHOW, this.show.bind(this));
        this.facade.registerOnEvent(ORYX.CONFIG.EVENT_OVERLAY_HIDE, this.hide.bind(this));
        this.styleNode = document.createElement("style");
        this.styleNode.setAttributeNS(null, "type", "text/css");
        document.getElementsByTagName("head")[0].appendChild(this.styleNode)
    }, show: function (a) {
        if (!a || !a.shapes || !a.shapes instanceof Array || !a.id || !a.id instanceof String || a.id.length == 0) {
            return
        }
        if (a.attributes) {
            a.shapes.each(function (d) {
                if (!d instanceof ORYX.Core.Shape) {
                    return
                }
                this.setAttributes(d.node, a.attributes)
            }.bind(this))
        }
        var c = true;
        try {
            c = a.node && a.node instanceof SVGElement
        } catch (b) {
        }
        if (a.node && c) {
            a._temps = [];
            a.shapes.each(function (g, f) {
                if (!g instanceof ORYX.Core.Shape) {
                    return
                }
                var e = {};
                e.svg = a.dontCloneNode ? a.node : a.node.cloneNode(true);
                g.node.firstChild.appendChild(e.svg);
                if (g instanceof ORYX.Core.Edge && !a.nodePosition) {
                    a.nodePosition = "START"
                }
                if (a.nodePosition) {
                    var d = g.bounds;
                    var h = a.nodePosition.toUpperCase();
                    if (g instanceof ORYX.Core.Node && h == "START") {
                        h = "NW"
                    } else {
                        if (g instanceof ORYX.Core.Node && h == "END") {
                            h = "SE"
                        } else {
                            if (g instanceof ORYX.Core.Edge && h == "START") {
                                d = g.getDockers().first().bounds
                            } else {
                                if (g instanceof ORYX.Core.Edge && h == "END") {
                                    d = g.getDockers().last().bounds
                                }
                            }
                        }
                    }
                    e.callback = function () {
                        var k = 0;
                        var l = 0;
                        if (h == "NW") {
                        } else {
                            if (h == "N") {
                                k = d.width() / 2
                            } else {
                                if (h == "NE") {
                                    k = d.width()
                                } else {
                                    if (h == "E") {
                                        k = d.width();
                                        l = d.height() / 2
                                    } else {
                                        if (h == "SE") {
                                            k = d.width();
                                            l = d.height()
                                        } else {
                                            if (h == "S") {
                                                k = d.width() / 2;
                                                l = d.height()
                                            } else {
                                                if (h == "SW") {
                                                    l = d.height()
                                                } else {
                                                    if (h == "W") {
                                                        l = d.height() / 2
                                                    } else {
                                                        if (h == "START" || h == "END") {
                                                            k = d.width() / 2;
                                                            l = d.height() / 2
                                                        } else {
                                                            return
                                                        }
                                                    }
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        }
                        if (g instanceof ORYX.Core.Edge) {
                            k += d.upperLeft().x;
                            l += d.upperLeft().y
                        }
                        e.svg.setAttributeNS(null, "transform", "translate(" + k + ", " + l + ")")
                    }.bind(this);
                    e.element = g;
                    e.callback();
                    d.registerCallback(e.callback)
                }
                a._temps.push(e)
            }.bind(this))
        }
        if (!this.changes[a.id]) {
            this.changes[a.id] = []
        }
        this.changes[a.id].push(a)
    }, hide: function (a) {
        if (!a || !a.id || !a.id instanceof String || a.id.length == 0 || !this.changes[a.id]) {
            return
        }
        this.changes[a.id].each(function (b) {
            b.shapes.each(function (d, c) {
                if (!d instanceof ORYX.Core.Shape) {
                    return
                }
                this.deleteAttributes(d.node)
            }.bind(this));
            if (b._temps) {
                b._temps.each(function (c) {
                    if (c.svg && c.svg.parentNode) {
                        c.svg.parentNode.removeChild(c.svg)
                    }
                    if (c.callback && c.element) {
                        c.element.bounds.unregisterCallback(c.callback)
                    }
                }.bind(this))
            }
        }.bind(this));
        this.changes[a.id] = null
    }, setAttributes: function (c, d) {
        var h = this.getAllChilds(c.firstChild.firstChild);
        var a = [];
        h.each(function (m) {
            a.push($A(m.attributes).findAll(function (n) {
                return n.nodeValue.startsWith("url(#")
            }))
        });
        a = a.flatten().compact();
        a = a.collect(function (m) {
            return m.nodeValue
        }).uniq();
        a = a.collect(function (m) {
            return m.slice(5, m.length - 1)
        });
        a.unshift(c.id + " .me");
        var g = $H(d);
        var e = g.toJSON().gsub(",", ";").gsub('"', "");
        var k = d.stroke ? e.slice(0, e.length - 1) + "; fill:" + d.stroke + ";}" : e;
        var f;
        if (d.fill) {
            var b = Object.clone(d);
            b.fill = "black";
            f = $H(b).toJSON().gsub(",", ";").gsub('"', "")
        }
        csstags = a.collect(function (n, m) {
            return "#" + n + " * " + (!m ? e : k) + "" + (f ? " #" + n + " text * " + f : "")
        });
        var l = csstags.join(" ") + "\n";
        this.styleNode.appendChild(document.createTextNode(l))
    }, deleteAttributes: function (b) {
        var a = $A(this.styleNode.childNodes).findAll(function (c) {
            return c.textContent.include("#" + b.id)
        });
        a.each(function (c) {
            c.parentNode.removeChild(c)
        })
    }, getAllChilds: function (a) {
        var b = $A(a.childNodes);
        $A(a.childNodes).each(function (c) {
            b.push(this.getAllChilds(c))
        }.bind(this));
        return b.flatten()
    }
});
if (!ORYX.Plugins) {
    ORYX.Plugins = new Object()
}
ORYX.Plugins.KeysMove = ORYX.Plugins.AbstractPlugin.extend({
    facade: undefined, construct: function (a) {
        this.facade = a;
        this.copyElements = [];
        this.facade.offer({
            keyCodes: [{
                metaKeys: [ORYX.CONFIG.META_KEY_META_CTRL],
                keyCode: 65,
                keyAction: ORYX.CONFIG.KEY_ACTION_DOWN
            }], functionality: this.selectAll.bind(this)
        });
        this.facade.offer({
            keyCodes: [{
                metaKeys: [ORYX.CONFIG.META_KEY_META_CTRL],
                keyCode: ORYX.CONFIG.KEY_CODE_LEFT,
                keyAction: ORYX.CONFIG.KEY_ACTION_DOWN
            }], functionality: this.move.bind(this, ORYX.CONFIG.KEY_CODE_LEFT, false)
        });
        this.facade.offer({
            keyCodes: [{keyCode: ORYX.CONFIG.KEY_CODE_LEFT, keyAction: ORYX.CONFIG.KEY_ACTION_DOWN}],
            functionality: this.move.bind(this, ORYX.CONFIG.KEY_CODE_LEFT, true)
        });
        this.facade.offer({
            keyCodes: [{
                metaKeys: [ORYX.CONFIG.META_KEY_META_CTRL],
                keyCode: ORYX.CONFIG.KEY_CODE_RIGHT,
                keyAction: ORYX.CONFIG.KEY_ACTION_DOWN
            }], functionality: this.move.bind(this, ORYX.CONFIG.KEY_CODE_RIGHT, false)
        });
        this.facade.offer({
            keyCodes: [{keyCode: ORYX.CONFIG.KEY_CODE_RIGHT, keyAction: ORYX.CONFIG.KEY_ACTION_DOWN}],
            functionality: this.move.bind(this, ORYX.CONFIG.KEY_CODE_RIGHT, true)
        });
        this.facade.offer({
            keyCodes: [{
                metaKeys: [ORYX.CONFIG.META_KEY_META_CTRL],
                keyCode: ORYX.CONFIG.KEY_CODE_UP,
                keyAction: ORYX.CONFIG.KEY_ACTION_DOWN
            }], functionality: this.move.bind(this, ORYX.CONFIG.KEY_CODE_UP, false)
        });
        this.facade.offer({
            keyCodes: [{keyCode: ORYX.CONFIG.KEY_CODE_UP, keyAction: ORYX.CONFIG.KEY_ACTION_DOWN}],
            functionality: this.move.bind(this, ORYX.CONFIG.KEY_CODE_UP, true)
        });
        this.facade.offer({
            keyCodes: [{
                metaKeys: [ORYX.CONFIG.META_KEY_META_CTRL],
                keyCode: ORYX.CONFIG.KEY_CODE_DOWN,
                keyAction: ORYX.CONFIG.KEY_ACTION_DOWN
            }], functionality: this.move.bind(this, ORYX.CONFIG.KEY_CODE_DOWN, false)
        });
        this.facade.offer({
            keyCodes: [{keyCode: ORYX.CONFIG.KEY_CODE_DOWN, keyAction: ORYX.CONFIG.KEY_ACTION_DOWN}],
            functionality: this.move.bind(this, ORYX.CONFIG.KEY_CODE_DOWN, true)
        })
    }, selectAll: function (a) {
        Event.stop(a.event);
        this.facade.setSelection(this.facade.getCanvas().getChildShapes(true))
    }, move: function (n, k, l) {
        Event.stop(l.event);
        var b = k ? 20 : 5;
        var m = this.facade.getSelection();
        var g = this.facade.getSelection();
        var c = {x: 0, y: 0};
        switch (n) {
            case ORYX.CONFIG.KEY_CODE_LEFT:
                c.x = -1 * b;
                break;
            case ORYX.CONFIG.KEY_CODE_RIGHT:
                c.x = b;
                break;
            case ORYX.CONFIG.KEY_CODE_UP:
                c.y = -1 * b;
                break;
            case ORYX.CONFIG.KEY_CODE_DOWN:
                c.y = b;
                break
        }
        m = m.findAll(function (e) {
            if (e instanceof ORYX.Core.Node && e.dockers.length == 1 && m.include(e.dockers.first().getDockedShape())) {
                return false
            }
            var o = e.parent;
            do {
                if (m.include(o)) {
                    return false
                }
            } while (o = o.parent);
            return true
        });
        var f = true;
        var h = m.all(function (e) {
            if (e instanceof ORYX.Core.Edge) {
                if (e.isDocked()) {
                    f = false
                }
                return true
            }
            return false
        });
        if (h && !f) {
            return
        }
        m = m.map(function (o) {
            if (o instanceof ORYX.Core.Node) {
                return o
            } else {
                if (o instanceof ORYX.Core.Edge) {
                    var e = o.dockers;
                    if (m.include(o.dockers.first().getDockedShape())) {
                        e = e.without(o.dockers.first())
                    }
                    if (m.include(o.dockers.last().getDockedShape())) {
                        e = e.without(o.dockers.last())
                    }
                    return e
                } else {
                    return null
                }
            }
        }).flatten().compact();
        if (m.size() > 0) {
            var a = [this.facade.getCanvas().bounds.lowerRight().x, this.facade.getCanvas().bounds.lowerRight().y, 0, 0];
            m.each(function (e) {
                a[0] = Math.min(a[0], e.bounds.upperLeft().x);
                a[1] = Math.min(a[1], e.bounds.upperLeft().y);
                a[2] = Math.max(a[2], e.bounds.lowerRight().x);
                a[3] = Math.max(a[3], e.bounds.lowerRight().y)
            });
            if (a[0] + c.x < 0) {
                c.x = -a[0]
            }
            if (a[1] + c.y < 0) {
                c.y = -a[1]
            }
            if (a[2] + c.x > this.facade.getCanvas().bounds.lowerRight().x) {
                c.x = this.facade.getCanvas().bounds.lowerRight().x - a[2]
            }
            if (a[3] + c.y > this.facade.getCanvas().bounds.lowerRight().y) {
                c.y = this.facade.getCanvas().bounds.lowerRight().y - a[3]
            }
            if (c.x != 0 || c.y != 0) {
                var d = [new ORYX.Core.Command.Move(m, c, null, g, this)];
                this.facade.executeCommands(d)
            }
        }
    }, getUndockedCommant: function (b) {
        var a = ORYX.Core.Command.extend({
            construct: function (c) {
                this.dockers = c.collect(function (d) {
                    return d instanceof ORYX.Core.Controls.Docker ? {
                        docker: d,
                        dockedShape: d.getDockedShape(),
                        refPoint: d.referencePoint
                    } : undefined
                }).compact()
            }, execute: function () {
                this.dockers.each(function (c) {
                    c.docker.setDockedShape(undefined)
                })
            }, rollback: function () {
                this.dockers.each(function (c) {
                    c.docker.setDockedShape(c.dockedShape);
                    c.docker.setReferencePoint(c.refPoint)
                })
            }
        });
        command = new a(b);
        command.execute();
        return command
    },
});
if (!ORYX.Plugins) {
    ORYX.Plugins = {}
}
if (!ORYX.Plugins.Layouter) {
    ORYX.Plugins.Layouter = {}
}
new function () {
    ORYX.Plugins.Layouter.EdgeLayouter = ORYX.Plugins.AbstractLayouter.extend({
        layouted: ["http://b3mn.org/stencilset/bpmn1.1#SequenceFlow", "http://b3mn.org/stencilset/bpmn1.1#MessageFlow", "http://b3mn.org/stencilset/timjpdl3#SequenceFlow", "http://b3mn.org/stencilset/jbpm4#SequenceFlow", "http://b3mn.org/stencilset/bpmn2.0#MessageFlow", "http://b3mn.org/stencilset/bpmn2.0#SequenceFlow", "http://b3mn.org/stencilset/bpmn2.0choreography#MessageFlow", "http://b3mn.org/stencilset/bpmn2.0choreography#SequenceFlow", "http://b3mn.org/stencilset/bpmn2.0conversation#ConversationLink", "http://b3mn.org/stencilset/epc#ControlFlow", "http://www.signavio.com/stencilsets/processmap#ProcessLink", "http://www.signavio.com/stencilsets/organigram#connection"],
        layout: function (a) {
            a.each(function (b) {
                this.doLayout(b)
            }.bind(this))
        },
        doLayout: function (b) {
            var d = b.getIncomingNodes()[0];
            var c = b.getOutgoingNodes()[0];
            if (!d || !c) {
                return
            }
            var a = this.getPositions(d, c, b);
            if (a.length > 0) {
                this.setDockers(b, a[0].a, a[0].b)
            }
        },
        getPositions: function (r, s, e) {
            var u = r.absoluteBounds();
            var n = s.absoluteBounds();
            var q = u.center();
            var o = n.center();
            var l = u.midPoint();
            var d = n.midPoint();
            var k = Object.clone(e.dockers.first().referencePoint);
            var t = Object.clone(e.dockers.last().referencePoint);
            var c = e.dockers.first().getAbsoluteReferencePoint();
            var p = e.dockers.last().getAbsoluteReferencePoint();
            if (Math.abs(c.x - p.x) < 1 || Math.abs(c.y - p.y) < 1) {
                return []
            }
            var g = {};
            g.x = q.x < o.x ? (((o.x - n.width() / 2) - (q.x + u.width() / 2)) / 2) + (q.x + u.width() / 2) : (((q.x - u.width() / 2) - (o.x + n.width() / 2)) / 2) + (o.x + n.width() / 2);
            g.y = q.y < o.y ? (((o.y - n.height() / 2) - (q.y + u.height() / 2)) / 2) + (q.y + u.height() / 2) : (((q.y - u.height() / 2) - (o.y + n.height() / 2)) / 2) + (o.y + n.height() / 2);
            u.widen(5);
            n.widen(20);
            var h = [];
            var f = this.getOffset.bind(this);
            if (!u.isIncluded(o.x, q.y) && !n.isIncluded(o.x, q.y)) {
                h.push({
                    a: {x: o.x + f(t, d, "x"), y: q.y + f(k, l, "y")},
                    z: this.getWeight(r, q.x < o.x ? "r" : "l", s, q.y < o.y ? "t" : "b", e)
                })
            }
            if (!u.isIncluded(q.x, o.y) && !n.isIncluded(q.x, o.y)) {
                h.push({
                    a: {x: q.x + f(k, l, "x"), y: o.y + f(t, d, "y")},
                    z: this.getWeight(r, q.y < o.y ? "b" : "t", s, q.x < o.x ? "l" : "r", e)
                })
            }
            if (!u.isIncluded(g.x, q.y) && !n.isIncluded(g.x, o.y)) {
                h.push({
                    a: {x: g.x, y: q.y + f(k, l, "y")},
                    b: {x: g.x, y: o.y + f(t, d, "y")},
                    z: this.getWeight(r, "r", s, "l", e, q.x > o.x)
                })
            }
            if (!u.isIncluded(q.x, g.y) && !n.isIncluded(o.x, g.y)) {
                h.push({
                    a: {x: q.x + f(k, l, "x"), y: g.y},
                    b: {x: o.x + f(t, d, "x"), y: g.y},
                    z: this.getWeight(r, "b", s, "t", e, q.y > o.y)
                })
            }
            return h.sort(function (v, m) {
                return v.z < m.z ? 1 : (v.z == m.z ? -1 : -1)
            })
        },
        getOffset: function (c, b, a) {
            return c[a] - b[a]
        },
        getWeight: function (m, b, n, a, d, g) {
            b = (b || "").toLowerCase();
            a = (a || "").toLowerCase();
            if (!["t", "r", "b", "l"].include(b)) {
                b = "r"
            }
            if (!["t", "r", "b", "l"].include(a)) {
                b = "l"
            }
            if (g) {
                b = b == "t" ? "b" : (b == "r" ? "l" : (b == "b" ? "t" : (b == "l" ? "r" : "r")));
                a = a == "t" ? "b" : (a == "r" ? "l" : (a == "b" ? "t" : (a == "l" ? "r" : "r")))
            }
            var f = 0;
            var p = this.facade.getRules().getLayoutingRules(m, d)["out"];
            var o = this.facade.getRules().getLayoutingRules(n, d)["in"];
            var e = p[b];
            var c = o[a];
            var l = function (s, r, q) {
                switch (s) {
                    case"t":
                        return Math.abs(r.x - q.x) < 2 && r.y < q.y;
                    case"r":
                        return r.x > q.x && Math.abs(r.y - q.y) < 2;
                    case"b":
                        return Math.abs(r.x - q.x) < 2 && r.y > q.y;
                    case"l":
                        return r.x < q.x && Math.abs(r.y - q.y) < 2;
                    default:
                        return false
                }
            };
            var k = m.getIncomingShapes().findAll(function (q) {
                return q instanceof ORYX.Core.Edge
            }).any(function (q) {
                return l(b, q.dockers[q.dockers.length - 2].bounds.center(), q.dockers.last().bounds.center())
            });
            var h = n.getOutgoingShapes().findAll(function (q) {
                return q instanceof ORYX.Core.Edge
            }).any(function (q) {
                return l(a, q.dockers[1].bounds.center(), q.dockers.first().bounds.center())
            });
            return (k || h ? 0 : e + c)
        },
        setDockers: function (e, d, c) {
            if (!e) {
                return
            }
            e.dockers.each(function (a) {
                e.removeDocker(a)
            });
            [d, c].compact().each(function (b) {
                var a = e.createDocker(undefined, b);
                a.bounds.centerMoveTo(b)
            });
            e.dockers.each(function (a) {
                a.update()
            });
            e._update(true)
        }
    })
}();
if (!ORYX.Plugins) {
    ORYX.Plugins = new Object()
}
new function () {
    ORYX.Plugins.BPMN2_0 = {
        construct: function (b) {
            this.facade = b;
            this.facade.registerOnEvent(ORYX.CONFIG.EVENT_DRAGDOCKER_DOCKED, this.handleDockerDocked.bind(this));
            this.facade.registerOnEvent(ORYX.CONFIG.EVENT_PROPWINDOW_PROP_CHANGED, this.handlePropertyChanged.bind(this));
            this.facade.registerOnEvent("layout.bpmn2_0.pool", this.handleLayoutPool.bind(this));
            this.facade.registerOnEvent("layout.bpmn2_0.subprocess", this.handleSubProcess.bind(this));
            this.facade.registerOnEvent(ORYX.CONFIG.EVENT_SHAPEREMOVED, this.handleShapeRemove.bind(this));
            this.facade.registerOnEvent(ORYX.CONFIG.EVENT_LOADED, this.afterLoad.bind(this));
            this.namespace = undefined
        },
        afterLoad: function () {
            this.facade.getCanvas().getChildNodes().each(function (b) {
                if (b.getStencil().id().endsWith("Pool")) {
                    this.handleLayoutPool({shape: b})
                }
            }.bind(this))
        },
        onSelectionChanged: function (h) {
            var f = h.elements;
            if (f && f.length === 1) {
                var e = this.getNamespace();
                var b = f[0];
                if (b.getStencil().idWithoutNs() === "Pool") {
                    if (b.getChildNodes().length === 0) {
                        var d = {
                            type: e + "Lane",
                            position: {x: 0, y: 0},
                            namespace: b.getStencil().namespace(),
                            parent: b
                        };
                        this.facade.createShape(d);
                        this.facade.getCanvas().update();
                        this.facade.setSelection([b])
                    }
                }
            }
            if (f.any(function (l) {
                return l instanceof ORYX.Core.Node && l.getStencil().id().endsWith("Lane")
            })) {
                var c = f.findAll(function (l) {
                    return l instanceof ORYX.Core.Node && l.getStencil().id().endsWith("Lane")
                });
                var g = [];
                var k = [];
                c.each(function (l) {
                    g.push(this.getParentPool(l))
                }.bind(this));
                g = g.uniq().findAll(function (l) {
                    var m = this.getLanes(l, true);
                    if (m.all(function (n) {
                        return c.include(n)
                    })) {
                        k = k.concat(m);
                        return true
                    } else {
                        if (f.include(l) && m.any(function (n) {
                            return c.include(n)
                        })) {
                            k = k.concat(m);
                            return true
                        } else {
                            return false
                        }
                    }
                }.bind(this));
                if (k.length > 0 && g.length > 0) {
                    f = f.without.apply(f, k);
                    f = f.concat(g);
                    this.facade.setSelection(f.uniq())
                }
            }
        },
        handleShapeRemove: function (e) {
            var f = e.shape;
            var l = e.parent;
            if (f instanceof ORYX.Core.Node && f.getStencil().idWithoutNs() === "Lane" && this.facade.isExecutingCommands()) {
                var g = this.getParentPool(l);
                if (g && g.parent) {
                    var h = function (m) {
                        return !m.getChildNodes().any(function (n) {
                            return n.getStencil().idWithoutNs() === "Lane"
                        })
                    };
                    var c = h(f);
                    var k = l.getChildNodes().any(function (m) {
                        return m.getStencil().idWithoutNs() === "Lane"
                    });
                    if (c && k) {
                        var d = new a(f, l, g, this);
                        this.facade.executeCommands([d])
                    } else {
                        if (!c && !this.facade.getSelection().any(function (m) {
                            return m instanceof ORYX.Core.Node && m.getStencil().idWithoutNs() === "Lane" && m.isParent(f) && h(m)
                        })) {
                            var b = ORYX.Core.Command.extend({
                                construct: function (m, n) {
                                    this.children = m.getChildNodes(true);
                                    this.facade = n
                                }, execute: function () {
                                    this.children.each(function (m) {
                                        m.bounds.moveBy(30, 0)
                                    })
                                }, rollback: function () {
                                    this.children.each(function (m) {
                                        m.bounds.moveBy(-30, 0)
                                    })
                                }
                            });
                            this.facade.executeCommands([new b(f, this.facade)])
                        } else {
                            if (c && !k && l == g) {
                                l.add(f)
                            }
                        }
                    }
                }
            }
        },
        hashedSubProcesses: {},
        hashChildShapes: function (b) {
            var c = b.getChildNodes();
            c.each(function (d) {
                if (this.hashedSubProcesses[d.id]) {
                    this.hashedSubProcesses[d.id] = d.absoluteXY();
                    this.hashedSubProcesses[d.id].width = d.bounds.width();
                    this.hashedSubProcesses[d.id].height = d.bounds.height();
                    this.hashChildShapes(d)
                }
            }.bind(this))
        },
        handleSubProcess: function (d) {
            var c = d.shape;
            if (!this.hashedSubProcesses[c.id]) {
                this.hashedSubProcesses[c.id] = c.absoluteXY();
                this.hashedSubProcesses[c.id].width = c.bounds.width();
                this.hashedSubProcesses[c.id].height = c.bounds.height();
                return
            }
            var e = c.absoluteXY();
            e.x -= this.hashedSubProcesses[c.id].x;
            e.y -= this.hashedSubProcesses[c.id].y;
            var b = this.hashedSubProcesses[c.id].width !== c.bounds.width() || this.hashedSubProcesses[c.id].height !== c.bounds.height();
            this.hashedSubProcesses[c.id] = c.absoluteXY();
            this.hashedSubProcesses[c.id].width = c.bounds.width();
            this.hashedSubProcesses[c.id].height = c.bounds.height();
            this.hashChildShapes(c);
            if (this.facade.isExecutingCommands() && !b) {
                this.moveChildDockers(c, e)
            }
        },
        moveChildDockers: function (d, g) {
            if (!g.x && !g.y) {
                return
            }
            var e = d.getChildNodes(true);
            var c = e.map(function (h) {
                return [].concat(h.getIncomingShapes()).concat(h.getOutgoingShapes())
            }).flatten().uniq().map(function (h) {
                return h.dockers.length > 2 ? h.dockers.slice(1, h.dockers.length - 1) : []
            }).flatten();
            var b = d.absoluteBounds();
            b.moveBy(-g.x, -g.y);
            var f = {};
            c.each(function (m) {
                if (m.isChanged) {
                    return
                }
                var k = Object.clone(g);
                if (!b.isIncluded(m.bounds.center())) {
                    var o = m.parent.dockers.indexOf(m);
                    var s = m.parent.dockers.length;
                    var q = m.parent.getSource();
                    var r = m.parent.getTarget();
                    var l = e.include(q) && e.include(r);
                    if (!l) {
                        var n = o !== 0 ? b.isIncluded(m.parent.dockers[o - 1].bounds.center()) : false;
                        var p = o !== s - 1 ? b.isIncluded(m.parent.dockers[o + 1].bounds.center()) : false;
                        if (!n && !p) {
                            return
                        }
                        var h = m.parent.dockers[n ? o - 1 : o + 1];
                        if (Math.abs(-Math.abs(h.bounds.center().x - m.bounds.center().x)) < 2) {
                            k.y = 0
                        } else {
                            if (Math.abs(-Math.abs(h.bounds.center().y - m.bounds.center().y)) < 2) {
                                k.x = 0
                            } else {
                                return
                            }
                        }
                    }
                }
                f[m.getId()] = {docker: m, offset: k}
            });
            this.facade.executeCommands([new ORYX.Core.MoveDockersCommand(f)])
        },
        handleDockerDocked: function (d) {
            var e = this.getNamespace();
            var f = d.parent;
            var c = d.target;
            if (f.getStencil().id() === e + "SequenceFlow") {
                var b = c.getStencil().groups().find(function (g) {
                    if (g == "Gateways") {
                        return g
                    }
                });
                if (!b && (f.properties["oryx-conditiontype"] == "Expression")) {
                    f.setProperty("oryx-showdiamondmarker", true)
                } else {
                    f.setProperty("oryx-showdiamondmarker", false)
                }
                this.facade.getCanvas().update()
            }
        },
        handlePropertyChanged: function (e) {
            var d = this.getNamespace();
            var c = e.elements;
            var f = e.key;
            var b = e.value;
            var g = false;
            c.each(function (k) {
                if ((k.getStencil().id() === d + "SequenceFlow") && (f === "oryx-conditiontype")) {
                    if (b != "Expression") {
                        k.setProperty("oryx-showdiamondmarker", false)
                    } else {
                        var l = k.getIncomingShapes();
                        if (!l) {
                            k.setProperty("oryx-showdiamondmarker", true)
                        }
                        var h = l.find(function (m) {
                            var n = m.getStencil().groups().find(function (o) {
                                if (o == "Gateways") {
                                    return o
                                }
                            });
                            if (n) {
                                return n
                            }
                        });
                        if (!h) {
                            k.setProperty("oryx-showdiamondmarker", true)
                        } else {
                            k.setProperty("oryx-showdiamondmarker", false)
                        }
                    }
                    g = true
                }
            }.bind(this));
            if (g) {
                this.facade.getCanvas().update()
            }
        },
        hashedPoolPositions: {},
        hashedLaneDepth: {},
        hashedBounds: {},
        hashedPositions: {},
        handleLayoutPool: function (u) {
            var o = u.shape;
            var F = this.facade.getSelection();
            var w = F.include(o) ? o : F.first();
            w = w || o;
            this.currentPool = o;
            if (!(w.getStencil().id().endsWith("Pool") || w.getStencil().id().endsWith("Lane"))) {
                return
            }
            if (w !== o && !w.isParent(o) && !this.hashedBounds[o.id][w.id]) {
                return
            }
            if (!this.hashedBounds[o.id]) {
                this.hashedBounds[o.id] = {}
            }
            var A = this.getLanes(o);
            if (A.length <= 0) {
                return
            }
            var z = this.getLanes(o, true), b;
            var g = z.clone();
            var k = $H({});
            z.each(function (x) {
                k[x.id] = x.bounds.upperLeft()
            });
            if (A.length === 1 && this.getLanes(A.first()).length <= 0) {
                A.first().setProperty("oryx-showcaption", A.first().properties["oryx-name"].trim().length > 0);
                var d = A.first().node.getElementsByTagName("rect");
                d[0].setAttributeNS(null, "display", "none")
            } else {
                z.invoke("setProperty", "oryx-showcaption", true);
                z.each(function (x) {
                    var y = x.node.getElementsByTagName("rect");
                    y[0].removeAttributeNS(null, "display")
                })
            }
            var t = [];
            var n = [];
            var v = -1;
            while (++v < z.length) {
                if (!this.hashedBounds[o.id][z[v].id]) {
                    n.push(z[v])
                }
            }
            if (n.length > 0) {
                w = n.first()
            }
            var C = $H(this.hashedBounds[o.id]).keys();
            var v = -1;
            while (++v < C.length) {
                if (!z.any(function (x) {
                    return x.id == C[v]
                })) {
                    t.push(this.hashedBounds[o.id][C[v]]);
                    F = F.without(function (x) {
                        return x.id == C[v]
                    })
                }
            }
            var q, s, m, l;
            if (t.length > 0 || n.length > 0) {
                if (n.length === 1 && this.getLanes(n[0].parent).length === 1) {
                    q = this.adjustHeight(A, n[0].parent)
                } else {
                    q = this.updateHeight(o)
                }
                s = this.adjustWidth(A, o.bounds.width());
                o.update()
            } else {
                if (o == w) {
                    if (F.length === 1 && this.isResized(o, this.hashedPoolPositions[o.id])) {
                        var B = this.hashedPoolPositions[o.id].upperLeft();
                        var f = o.bounds.upperLeft();
                        var E = 0;
                        if (this.shouldScale(o)) {
                            var c = this.hashedPoolPositions[o.id];
                            E = c.height() / o.bounds.height()
                        }
                        this.adjustLanes(o, z, B.x - f.x, B.y - f.y, E)
                    }
                    q = this.adjustHeight(A, undefined, o.bounds.height());
                    s = this.adjustWidth(A, o.bounds.width())
                } else {
                    if (F.length === 1 && this.isResized(w, this.hashedBounds[o.id][w.id])) {
                        var B = this.hashedBounds[o.id][w.id].upperLeft();
                        var f = w.absoluteXY();
                        m = B.x - f.x;
                        l = B.y - f.y;
                        if (m || l) {
                            g = g.without(w);
                            this.adjustLanes(o, this.getAllExcludedLanes(o, w), m, 0)
                        }
                        var h = this.getLanes(w, true);
                        if (h.length > 0) {
                            if (this.shouldScale(w)) {
                                var c = this.hashedBounds[o.id][w.id];
                                var E = c.height() / w.bounds.height();
                                this.adjustLanes(o, h, m, l, E)
                            } else {
                                this.adjustLanes(o, h, m, l, 0)
                            }
                        }
                    }
                    var D = z.map(function (x) {
                        return {shape: x, bounds: x.bounds.clone()}
                    });
                    q = this.adjustHeight(A, w);
                    this.checkForChanges(z, D);
                    s = this.adjustWidth(A, w.bounds.width() + (this.getDepth(w, o) * 30))
                }
            }
            this.setDimensions(o, s, q, m, l);
            if (this.facade.isExecutingCommands() && (t.length === 0 || n.length !== 0)) {
                this.updateDockers(g, o);
                if (this.hashedPositions[o.id] && this.hashedPositions[o.id].keys().any(function (y, x) {
                    return (z[x] || {}).id !== y
                })) {
                    var r = ORYX.Core.Command.extend({
                        construct: function (H, G, y, I, x) {
                            this.originPosition = Object.clone(H);
                            this.newPosition = Object.clone(G);
                            this.lanes = y;
                            this.plugin = I;
                            this.pool = x
                        }, execute: function () {
                            if (!this.executed) {
                                this.executed = true;
                                this.lanes.each(function (x) {
                                    if (this.newPosition[x.id]) {
                                        x.bounds.moveTo(this.newPosition[x.id])
                                    }
                                }.bind(this));
                                this.plugin.hashedPositions[this.pool] = Object.clone(this.newPosition)
                            }
                        }, rollback: function () {
                            this.lanes.each(function (x) {
                                if (this.originPosition[x.id]) {
                                    x.bounds.moveTo(this.originPosition[x.id])
                                }
                            }.bind(this));
                            this.plugin.hashedPositions[this.pool] = Object.clone(this.originPosition)
                        }
                    });
                    var p = $H({});
                    z.each(function (x) {
                        p[x.id] = x.bounds.upperLeft()
                    });
                    var e = new r(k, p, z, this, o.id);
                    this.facade.executeCommands([e])
                }
            }
            this.hashedBounds[o.id] = {};
            this.hashedPositions[o.id] = k;
            var v = -1;
            while (++v < z.length) {
                this.hashedBounds[o.id][z[v].id] = z[v].absoluteBounds();
                this.hashChildShapes(z[v]);
                this.hashedLaneDepth[z[v].id] = this.getDepth(z[v], o);
                this.forceToUpdateLane(z[v])
            }
            this.hashedPoolPositions[o.id] = o.bounds.clone()
        },
        shouldScale: function (b) {
            var c = b.getChildNodes().findAll(function (d) {
                return d.getStencil().id().endsWith("Lane")
            });
            return c.length > 1 || c.any(function (d) {
                return this.shouldScale(d)
            }.bind(this))
        },
        checkForChanges: function (b, c) {
            if (this.facade.isExecutingCommands() && c.any(function (e) {
                return e.shape.bounds.toString() !== e.bounds.toString()
            })) {
                var d = ORYX.Core.Command.extend({
                    construct: function (e) {
                        this.oldState = e;
                        this.newState = e.map(function (f) {
                            return {shape: f.shape, bounds: f.bounds.clone()}
                        })
                    }, execute: function () {
                        if (this.executed) {
                            this.applyState(this.newState)
                        }
                        this.executed = true
                    }, rollback: function () {
                        this.applyState(this.oldState)
                    }, applyState: function (e) {
                        e.each(function (f) {
                            f.shape.bounds.set(f.bounds.upperLeft(), f.bounds.lowerRight())
                        })
                    }
                });
                this.facade.executeCommands([new d(c)])
            }
        },
        isResized: function (b, d) {
            if (!d || !b) {
                return false
            }
            var c = d;
            return Math.round(c.width() - b.bounds.width()) !== 0 || Math.round(c.height() - b.bounds.height()) !== 0
        },
        adjustLanes: function (d, c, b, f, e) {
            e = e || 0;
            c.each(function (g) {
                g.getChildNodes().each(function (k) {
                    if (!k.getStencil().id().endsWith("Lane")) {
                        var h = e ? k.bounds.center().y - (k.bounds.center().y / e) : -f;
                        k.bounds.moveBy((b || 0), -h);
                        if (e && k.getStencil().id().endsWith("Subprocess")) {
                            this.moveChildDockers(k, {x: (0), y: -h})
                        }
                    }
                }.bind(this));
                this.hashedBounds[d.id][g.id].moveBy(-(b || 0), !e ? -f : 0);
                if (e) {
                    g.isScaled = true
                }
            }.bind(this))
        },
        getAllExcludedLanes: function (d, b) {
            var c = [];
            d.getChildNodes().each(function (e) {
                if ((!b || e !== b) && e.getStencil().id().endsWith("Lane")) {
                    c.push(e);
                    c = c.concat(this.getAllExcludedLanes(e, b))
                }
            }.bind(this));
            return c
        },
        forceToUpdateLane: function (b) {
            if (b.bounds.height() !== b._svgShapes[0].height) {
                b.isChanged = true;
                b.isResized = true;
                b._update()
            }
        },
        getDepth: function (d, c) {
            var b = 0;
            while (d && d.parent && d !== c) {
                d = d.parent;
                ++b
            }
            return b
        },
        updateDepth: function (c, b, d) {
            var e = (b - d) * 30;
            c.getChildNodes().each(function (f) {
                f.bounds.moveBy(e, 0);
                [].concat(children[j].getIncomingShapes()).concat(children[j].getOutgoingShapes())
            })
        },
        setDimensions: function (e, f, c, b, g) {
            var d = e.getStencil().id().endsWith("Lane");
            e.bounds.set(d ? 30 : (e.bounds.a.x - (b || 0)), d ? e.bounds.a.y : (e.bounds.a.y - (g || 0)), f ? e.bounds.a.x + f - (d ? 30 : (b || 0)) : e.bounds.b.x, c ? e.bounds.a.y + c - (d ? 0 : (g || 0)) : e.bounds.b.y)
        },
        setLanePosition: function (b, c) {
            b.bounds.moveTo(30, c)
        },
        adjustWidth: function (b, c) {
            (b || []).each(function (d) {
                this.setDimensions(d, c);
                this.adjustWidth(this.getLanes(d), c - 30)
            }.bind(this));
            return c
        },
        adjustHeight: function (e, g, c) {
            var h = 0;
            if (!g && c) {
                var f = -1;
                while (++f < e.length) {
                    h += e[f].bounds.height()
                }
            }
            var f = -1;
            var b = 0;
            while (++f < e.length) {
                if (e[f] === g) {
                    this.adjustHeight(this.getLanes(e[f]), undefined, e[f].bounds.height());
                    e[f].bounds.set({x: 30, y: b}, {x: e[f].bounds.width() + 30, y: e[f].bounds.height() + b})
                } else {
                    if (!g && c) {
                        var d = (e[f].bounds.height() * c) / h;
                        this.adjustHeight(this.getLanes(e[f]), undefined, d);
                        this.setDimensions(e[f], null, d);
                        this.setLanePosition(e[f], b)
                    } else {
                        var d = this.adjustHeight(this.getLanes(e[f]), g, c);
                        if (!d) {
                            d = e[f].bounds.height()
                        }
                        this.setDimensions(e[f], null, d);
                        this.setLanePosition(e[f], b)
                    }
                }
                b += e[f].bounds.height()
            }
            return b
        },
        updateHeight: function (c) {
            var d = this.getLanes(c);
            if (d.length == 0) {
                return c.bounds.height()
            }
            var b = 0;
            var e = -1;
            while (++e < d.length) {
                this.setLanePosition(d[e], b);
                b += this.updateHeight(d[e])
            }
            this.setDimensions(c, null, b);
            return b
        },
        getOffset: function (b, d, c) {
            var f = {x: 0, y: 0};
            var f = b.absoluteXY();
            var e = this.hashedBounds[c.id][b.id] || (d === true ? this.hashedPoolPositions[b.id] : undefined);
            if (e) {
                f.x -= e.upperLeft().x;
                f.y -= e.upperLeft().y
            } else {
                return {x: 0, y: 0}
            }
            return f
        },
        getNextLane: function (b) {
            while (b && !b.getStencil().id().endsWith("Lane")) {
                if (b instanceof ORYX.Core.Canvas) {
                    return null
                }
                b = b.parent
            }
            return b
        },
        getParentPool: function (b) {
            while (b && !b.getStencil().id().endsWith("Pool")) {
                if (b instanceof ORYX.Core.Canvas) {
                    return null
                }
                b = b.parent
            }
            return b
        },
        updateDockers: function (B, t) {
            var r = t.absoluteBounds(), v = [];
            var s = (this.hashedPoolPositions[t.id] || r).clone();
            var A = -1, z = -1, y = -1, w = -1, u;
            var C = {};
            while (++A < B.length) {
                if (!this.hashedBounds[t.id][B[A].id]) {
                    continue
                }
                var d = B[A].isScaled;
                delete B[A].isScaled;
                var h = B[A].getChildNodes();
                var p = B[A].absoluteBounds();
                var e = (this.hashedBounds[t.id][B[A].id] || p);
                var m = this.getOffset(B[A], true, t);
                var f = 0;
                var E = this.getDepth(B[A], t);
                if (this.hashedLaneDepth[B[A].id] !== undefined && this.hashedLaneDepth[B[A].id] !== E) {
                    f = (this.hashedLaneDepth[B[A].id] - E) * 30;
                    m.x += f
                }
                z = -1;
                while (++z < h.length) {
                    if (f && !h[z].getStencil().id().endsWith("Lane")) {
                        v.push({xOffset: f, shape: h[z]});
                        h[z].bounds.moveBy(f, 0)
                    }
                    if (h[z].getStencil().id().endsWith("Subprocess")) {
                        this.moveChildDockers(h[z], m)
                    }
                    var c = [].concat(h[z].getIncomingShapes()).concat(h[z].getOutgoingShapes()).findAll(function (k) {
                        return k instanceof ORYX.Core.Edge
                    });
                    y = -1;
                    while (++y < c.length) {
                        if (c[y].getStencil().id().endsWith("MessageFlow")) {
                            this.layoutEdges(h[z], [c[y]], m);
                            continue
                        }
                        w = -1;
                        while (++w < c[y].dockers.length) {
                            u = c[y].dockers[w];
                            if (u.getDockedShape() || u.isChanged) {
                                continue
                            }
                            pos = u.bounds.center();
                            var b = e.isIncluded(pos);
                            var q = !s.isIncluded(pos);
                            var g = w == 0 ? b : e.isIncluded(c[y].dockers[w - 1].bounds.center());
                            var n = w == c[y].dockers.length - 1 ? b : e.isIncluded(c[y].dockers[w + 1].bounds.center());
                            var D = Object.clone(m);
                            if (d && b && this.isResized(B[A], this.hashedBounds[t.id][B[A].id])) {
                                var x = (pos.y - p.upperLeft().y + D.y);
                                D.y -= (x - (x * (p.height() / e.height())))
                            }
                            if (b) {
                                C[u.id] = {docker: u, offset: D}
                            }
                        }
                    }
                }
            }
            var o = ORYX.Core.Command.extend({
                construct: function (k) {
                    this.state = k
                }, execute: function () {
                    if (this.executed) {
                        this.state.each(function (k) {
                            k.shape.bounds.moveBy(k.xOffset, 0)
                        })
                    }
                    this.executed = true
                }, rollback: function () {
                    this.state.each(function (k) {
                        k.shape.bounds.moveBy(-k.xOffset, 0)
                    })
                }
            });
            this.facade.executeCommands([new ORYX.Core.MoveDockersCommand(C), new o(v)])
        },
        moveBy: function (c, b) {
            c.x += b.x;
            c.y += b.y;
            return c
        },
        getHashedBounds: function (b) {
            return this.currentPool && this.hashedBounds[this.currentPool.id][b.id] ? this.hashedBounds[this.currentPool.id][b.id] : b.absoluteBounds()
        },
        getLanes: function (b, d) {
            var e = this.getNamespace();
            var c = b.getChildNodes(d || false).findAll(function (f) {
                return (f.getStencil().id() === e + "Lane")
            });
            c = c.sort(function (w, u) {
                var v = Math.round(w.bounds.upperLeft().y);
                var p = Math.round(u.bounds.upperLeft().y);
                var s = Math.round(w.bounds.lowerRight().y);
                var m = Math.round(u.bounds.lowerRight().y);
                var h = this.getHashedBounds(w);
                var g = this.getHashedBounds(u);
                var o = Math.round(h.upperLeft().y);
                var y = Math.round(g.upperLeft().y);
                var l = Math.round(h.lowerRight().y);
                var x = Math.round(g.lowerRight().y);
                if (v == p && s == m) {
                    v = o;
                    p = y;
                    s = l;
                    m = x
                }
                if (Math.round(w.bounds.height() - h.height()) === 0 && Math.round(u.bounds.height() - g.height()) === 0) {
                    return v < p ? -1 : (v > p ? 1 : 0)
                }
                var t = v < p && s < m;
                var q = v > p && s > m;
                var k = v < p && s >= m && l < x;
                var n = v >= p && s < m && o < y;
                var r = v > p && s <= m && l > x;
                var f = v <= p && s > m && o > y;
                return (t || k || n ? -1 : (q || r || f ? 1 : 0))
            }.bind(this));
            return c
        },
        getNamespace: function () {
            if (!this.namespace) {
                var b = this.facade.getStencilSets();
                if (b.keys()) {
                    this.namespace = b.keys()[0]
                } else {
                    return undefined
                }
            }
            return this.namespace
        }
    };
    var a = ORYX.Core.Command.extend({
        construct: function (b, d, c, e) {
            this.facade = e.facade;
            this.plugin = e;
            this.shape = b;
            this.changes;
            this.pool = c;
            this.parent = d;
            this.shapeChildren = [];
            this.shape.getChildShapes().each(function (f) {
                this.shapeChildren.push({
                    shape: f,
                    bounds: {a: {x: f.bounds.a.x, y: f.bounds.a.y}, b: {x: f.bounds.b.x, y: f.bounds.b.y}}
                })
            }.bind(this));
            this.shapeUpperLeft = this.shape.bounds.upperLeft();
            this.parentHeight = this.parent.bounds.height()
        }, getLeafLanes: function (b) {
            var c = this.plugin.getLanes(b).map(function (d) {
                return this.getLeafLanes(d)
            }.bind(this)).flatten();
            return c.length > 0 ? c : [b]
        }, findNewLane: function () {
            var b = this.plugin.getLanes(this.parent);
            var c = this.getLeafLanes(this.parent);
            this.lane = c.find(function (d) {
                return d.bounds.upperLeft().y >= this.shapeUpperLeft.y
            }.bind(this)) || c.last();
            this.laneUpperLeft = this.lane.bounds.upperLeft()
        }, execute: function () {
            if (this.changes) {
                this.executeAgain();
                return
            }
            if (!this.lane) {
                this.findNewLane()
            }
            if (this.lane) {
                var f = this.laneUpperLeft;
                var d = this.shapeUpperLeft;
                var c = this.plugin.getDepth(this.lane, this.parent) - 1;
                this.changes = $H({});
                if (f.y >= d.y) {
                    this.lane.getChildShapes().each(function (g) {
                        if (!this.changes[g.getId()]) {
                            this.changes[g.getId()] = this.computeChanges(g, this.lane, this.lane, this.shape.bounds.height())
                        }
                        g.bounds.moveBy(0, this.shape.bounds.height())
                    }.bind(this));
                    this.plugin.hashChildShapes(this.lane);
                    this.shapeChildren.each(function (g) {
                        g.shape.bounds.set(g.bounds);
                        g.shape.bounds.moveBy((d.x - 30) - (c * 30), 0);
                        if (!this.changes[g.shape.getId()]) {
                            this.changes[g.shape.getId()] = this.computeChanges(g.shape, this.shape, this.lane, 0)
                        }
                        this.lane.add(g.shape)
                    }.bind(this));
                    this.lane.bounds.moveBy(0, d.y - f.y)
                } else {
                    if (d.y > f.y) {
                        this.shapeChildren.each(function (g) {
                            g.shape.bounds.set(g.bounds);
                            g.shape.bounds.moveBy((d.x - 30) - (c * 30), this.lane.bounds.height());
                            if (!this.changes[g.shape.getId()]) {
                                this.changes[g.shape.getId()] = this.computeChanges(g.shape, this.shape, this.lane, 0)
                            }
                            this.lane.add(g.shape)
                        }.bind(this))
                    }
                }
            }
            var e = this.lane.bounds.height();
            var b = this.lane.length === 1 ? this.parentHeight : this.lane.bounds.height() + this.shape.bounds.height();
            this.setHeight(b, e, this.parent, this.parentHeight, true);
            this.plugin.getLanes(this.parent).each(function (g) {
                if (!this.changes[g.getId()] && g !== this.lane && g !== this.shape) {
                    this.changes[g.getId()] = this.computeChanges(g, this.parent, this.parent, 0)
                }
            }.bind(this));
            this.update()
        }, setHeight: function (b, f, e, d, c) {
            this.plugin.setDimensions(this.lane, this.lane.bounds.width(), b);
            this.plugin.hashedBounds[this.pool.id][this.lane.id] = this.lane.absoluteBounds();
            this.plugin.adjustHeight(this.plugin.getLanes(e), this.lane);
            if (c === true) {
                this.changes[this.shape.getId()] = this.computeChanges(this.shape, e, e, 0, f, b)
            }
            this.plugin.setDimensions(e, e.bounds.width(), d);
            if (e !== this.pool) {
                this.plugin.setDimensions(this.pool, this.pool.bounds.width(), this.pool.bounds.height() + (b - f))
            }
        }, update: function () {
            this.plugin.hashedBounds[this.pool.id]["REMOVED"] = true
        }, rollback: function () {
            var c = this.laneUpperLeft;
            var b = this.shapeUpperLeft;
            this.changes.each(function (h) {
                var g = h.value.oldParent;
                var e = h.value.shape;
                var f = h.value.parentHeight;
                var k = h.value.oldHeight;
                var d = h.value.newHeight;
                if (e.getStencil().id().endsWith("Lane")) {
                    e.bounds.moveTo(h.value.oldPosition)
                }
                if (k) {
                    this.setHeight(k, d, g, g.bounds.height() + (k - d));
                    if (c.y >= b.y) {
                        this.lane.bounds.moveBy(0, this.shape.bounds.height() - 1)
                    }
                } else {
                    g.add(e);
                    e.bounds.moveTo(h.value.oldPosition)
                }
            }.bind(this))
        }, executeAgain: function () {
            this.changes.each(function (f) {
                var d = f.value.newParent;
                var c = f.value.shape;
                var b = f.value.newHeight;
                var h = f.value.oldHeight;
                if (b) {
                    var g = this.laneUpperLeft.y;
                    var e = this.shapeUpperLeft.y;
                    if (g >= e) {
                        this.lane.bounds.moveBy(0, e - g)
                    }
                    this.setHeight(b, h, d, d.bounds.height() + (b - h))
                } else {
                    d.add(c);
                    c.bounds.moveTo(f.value.newPosition)
                }
            }.bind(this));
            this.update()
        }, computeChanges: function (d, l, k, c, m, b) {
            l = this.changes[d.getId()] ? this.changes[d.getId()].oldParent : l;
            var h = this.changes[d.getId()] ? this.changes[d.getId()].oldPosition : d.bounds.upperLeft();
            var f = d.bounds.upperLeft();
            var e = {x: f.x, y: f.y + c};
            var g = {
                shape: d,
                parentHeight: l.bounds.height(),
                oldParent: l,
                oldPosition: h,
                oldHeight: m,
                newParent: k,
                newPosition: e,
                newHeight: b
            };
            return g
        }
    });
    ORYX.Plugins.BPMN2_0 = ORYX.Plugins.AbstractPlugin.extend(ORYX.Plugins.BPMN2_0)
}();